[WIN32K]
authorRafal Harabien <rafalh@reactos.org>
Fri, 25 Mar 2011 22:34:53 +0000 (22:34 +0000)
committerRafal Harabien <rafalh@reactos.org>
Fri, 25 Mar 2011 22:34:53 +0000 (22:34 +0000)
Make sure strings returned by internal function RegQueryValue are NULL terminated

svn path=/trunk/; revision=51139

reactos/subsystems/win32/win32k/misc/registry.c

index 86bac34..455aa3f 100644 (file)
@@ -58,7 +58,7 @@ RegQueryValue(
     ULONG cbInfoSize, cbDataSize;
 
     /* Check if the local buffer is sufficient */
     ULONG cbInfoSize, cbDataSize;
 
     /* Check if the local buffer is sufficient */
-    cbInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + *pcbValue;
+    cbInfoSize = FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) + *pcbValue;
     if (cbInfoSize <= sizeof(ajBuffer))
     {
         pInfo = (PVOID)ajBuffer;
     if (cbInfoSize <= sizeof(ajBuffer))
     {
         pInfo = (PVOID)ajBuffer;
@@ -89,8 +89,11 @@ RegQueryValue(
         /* Did we get the right type */
         if (pInfo->Type == ulType)
         {
         /* Did we get the right type */
         if (pInfo->Type == ulType)
         {
-            /* Copy the contents to the caller */
-            RtlCopyMemory(pvData, pInfo->Data, min(*pcbValue, cbDataSize));
+            /* Copy the contents to the caller. Make sure strings are null terminated */
+            if (ulType == REG_SZ || ulType == REG_MULTI_SZ || ulType == REG_EXPAND_SZ)
+                RtlStringCbCopyNW((LPWSTR)pvData, *pcbValue, (LPWSTR)pInfo->Data, cbDataSize);
+            else
+                RtlCopyMemory(pvData, pInfo->Data, cbDataSize);
         }
         else
             Status = STATUS_OBJECT_TYPE_MISMATCH;
         }
         else
             Status = STATUS_OBJECT_TYPE_MISMATCH;