Alexandre Julliard : server: Output incorrectly-terminated strings in hex format.

Alexandre Julliard julliard at winehq.org
Mon Jan 7 16:24:58 CST 2008


Module: wine
Branch: master
Commit: b647ded03dcbc036249aeb0318cab038131f191c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b647ded03dcbc036249aeb0318cab038131f191c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jan  7 21:06:49 2008 +0100

server: Output incorrectly-terminated strings in hex format.

---

 server/registry.c |   50 +++++++++++++++++++++++++-------------------------
 1 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/server/registry.c b/server/registry.c
index bfcd3d2..d402f2c 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -182,7 +182,7 @@ static void dump_path( const struct key *key, const struct key *base, FILE *f )
 /* dump a value to a text file */
 static void dump_value( const struct key_value *value, FILE *f )
 {
-    unsigned int i;
+    unsigned int i, dw;
     int count;
 
     if (value->namelen)
@@ -198,37 +198,37 @@ static void dump_value( const struct key_value *value, FILE *f )
     case REG_SZ:
     case REG_EXPAND_SZ:
     case REG_MULTI_SZ:
-        if (value->type != REG_SZ) fprintf( f, "str(%d):", value->type );
+        /* only output properly terminated strings in string format */
+        if (value->len < sizeof(WCHAR)) break;
+        if (value->len % sizeof(WCHAR)) break;
+        if (((WCHAR *)value->data)[value->len / sizeof(WCHAR) - 1]) break;
+        if (value->type != REG_SZ) fprintf( f, "str(%x):", value->type );
         fputc( '\"', f );
         if (value->data) dump_strW( (WCHAR *)value->data, value->len / sizeof(WCHAR), f, "\"\"" );
-        fputc( '\"', f );
-        break;
+        fprintf( f, "\"\n" );
+        return;
+
     case REG_DWORD:
-        if (value->len == sizeof(DWORD))
-        {
-            DWORD dw;
-            memcpy( &dw, value->data, sizeof(DWORD) );
-            fprintf( f, "dword:%08x", dw );
-            break;
-        }
-        /* else fall through */
-    default:
-        if (value->type == REG_BINARY) count += fprintf( f, "hex:" );
-        else count += fprintf( f, "hex(%x):", value->type );
-        for (i = 0; i < value->len; i++)
+        if (value->len != sizeof(dw)) break;
+        memcpy( &dw, value->data, sizeof(dw) );
+        fprintf( f, "dword:%08x\n", dw );
+        return;
+    }
+
+    if (value->type == REG_BINARY) count += fprintf( f, "hex:" );
+    else count += fprintf( f, "hex(%x):", value->type );
+    for (i = 0; i < value->len; i++)
+    {
+        count += fprintf( f, "%02x", *((unsigned char *)value->data + i) );
+        if (i < value->len-1)
         {
-            count += fprintf( f, "%02x", *((unsigned char *)value->data + i) );
-            if (i < value->len-1)
+            fputc( ',', f );
+            if (++count > 76)
             {
-                fputc( ',', f );
-                if (++count > 76)
-                {
-                    fprintf( f, "\\\n  " );
-                    count = 2;
-                }
+                fprintf( f, "\\\n  " );
+                count = 2;
             }
         }
-        break;
     }
     fputc( '\n', f );
 }




More information about the wine-cvs mailing list