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