- Fix weird code in RtlGetVersion (inspired by Coverity ID 1355 and Daniel's patch...
[reactos.git] / reactos / ntoskrnl / rtl / misc.c
index f933c57..2e99742 100644 (file)
@@ -39,6 +39,7 @@ RtlGetNtGlobalFlags(VOID)
 NTSTATUS STDCALL
 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
 {
+   ULONG i, MaxLength;
    if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) ||
        lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW))
    {
@@ -46,17 +47,19 @@ RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
       lpVersionInformation->dwMinorVersion = NtMinorVersion;
       lpVersionInformation->dwBuildNumber = NtBuildNumber;
       lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT;
+      RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
       if(((CmNtCSDVersion >> 8) & 0xFF) != 0)
       {
-        int i = _snwprintf(lpVersionInformation->szCSDVersion,
-                           (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1,
-                           L"Service Pack %d",
-                           ((CmNtCSDVersion >> 8) & 0xFF));
-        lpVersionInformation->szCSDVersion[i] = L'\0';
-      }
-      else
-      {
-        RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion));
+        MaxLength = (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1;
+        i = _snwprintf(lpVersionInformation->szCSDVersion,
+                       MaxLength,
+                       L"Service Pack %d",
+                       ((CmNtCSDVersion >> 8) & 0xFF));
+        if (i < 0)
+        {
+           /* null-terminate if it was overflowed */
+           lpVersionInformation->szCSDVersion[MaxLength] = L'\0';
+        }
       }
       if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW))
       {