[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH for 8.1] Cope with zero-length binary values in the registry



It appears that it is legitimate for the registry to contain zero-length
binary values, so the registry access code needs to cope with them and
the settings copy code needs to allow for them too.

Reported-by: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xenvif/registry.c | 21 +++++++++++++++------
 src/xenvif/settings.c |  3 ++-
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index f903922..23b948b 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -30,6 +30,7 @@
  */
 
 #include <ntddk.h>
+#include <stdlib.h>
 
 #include "registry.h"
 #include "assert.h"
@@ -937,25 +938,30 @@ RegistryQueryBinaryValue(
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    *Buffer = NULL;
+
     switch (Partial->Type) {
     case REG_BINARY:
+        *Length = Partial->DataLength;
+
+        if (*Length == 0)
+            break;
+
         *Buffer = __RegistryAllocate(Partial->DataLength);
 
         status = STATUS_NO_MEMORY;
         if (*Buffer == NULL)
             break;
 
-        *Length = Partial->DataLength;
         RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
         break;
 
     default:
         status = STATUS_INVALID_PARAMETER;
-        *Buffer = NULL;
         break;
     }
 
-    if (*Buffer == NULL)
+    if (!NT_SUCCESS(status))
         goto fail5;
 
     __RegistryFree(Partial);
@@ -996,7 +1002,7 @@ RegistryUpdateBinaryValue(
         goto fail1;
 
     Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, 
Data) +
-                                 Length);
+                                 __min(Length, 1));
 
     status = STATUS_NO_MEMORY;
     if (Partial == NULL)
@@ -1004,8 +1010,11 @@ RegistryUpdateBinaryValue(
 
     Partial->TitleIndex = 0;
     Partial->Type = REG_BINARY;
-    Partial->DataLength = Length;
-    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    if (Length != 0) {
+        Partial->DataLength = Length;
+        RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+    }
 
     status = ZwSetValueKey(Key,
                            &Unicode,
diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
index 96b06a2..3ce4771 100644
--- a/src/xenvif/settings.c
+++ b/src/xenvif/settings.c
@@ -119,7 +119,8 @@ SettingsCopyInterfaceValue(
                                              ValueName->Buffer,
                                              Value,
                                              Length);
-            RegistryFreeBinaryValue(Value);
+            if (Length != 0)
+                RegistryFreeBinaryValue(Value);
         }
 
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.