Alexandre Julliard : server: Make the registry parser more tolerant about malformed hex values.
Alexandre Julliard
julliard at winehq.org
Mon Jan 7 16:24:57 CST 2008
Module: wine
Branch: master
Commit: fb9955da8c592f6d0fc6373399139b479b47c7aa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fb9955da8c592f6d0fc6373399139b479b47c7aa
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jan 7 21:06:01 2008 +0100
server: Make the registry parser more tolerant about malformed hex values.
---
server/registry.c | 26 ++++++++++++++++----------
1 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/server/registry.c b/server/registry.c
index fa39279..bfcd3d2 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -1092,12 +1092,12 @@ static int get_data_type( const char *buffer, int *type, int *parse_type )
for (ptr = data_types; ptr->tag; ptr++)
{
- if (memcmp( ptr->tag, buffer, ptr->len )) continue;
+ if (strncmp( ptr->tag, buffer, ptr->len )) continue;
*parse_type = ptr->parse_type;
if ((*type = ptr->type) != -1) return ptr->len;
/* "hex(xx):" is special */
*type = (int)strtoul( buffer + 4, &end, 16 );
- if ((end <= buffer) || memcmp( end, "):", 2 )) return 0;
+ if ((end <= buffer) || strncmp( end, "):", 2 )) return 0;
return end + 2 - buffer;
}
return 0;
@@ -1146,17 +1146,18 @@ static int parse_hex( unsigned char *dest, data_size_t *len, const char *buffer
{
const char *p = buffer;
data_size_t count = 0;
+ char *end;
+
while (isxdigit(*p))
{
- int val;
- char buf[3];
- memcpy( buf, p, 2 );
- buf[2] = 0;
- sscanf( buf, "%x", &val );
+ unsigned int val = strtoul( p, &end, 16 );
+ if (end == p || val > 0xff) return -1;
if (count++ >= *len) return -1; /* dest buffer overflow */
- *dest++ = (unsigned char )val;
- p += 2;
+ *dest++ = val;
+ p = end;
+ while (isspace(*p)) p++;
if (*p == ',') p++;
+ while (isspace(*p)) p++;
}
*len = count;
return p - buffer;
@@ -1227,7 +1228,7 @@ static int load_value( struct key *key, const char *buffer, struct file_load_inf
len = 0;
for (;;)
{
- maxlen = 1 + strlen(buffer)/3; /* 3 chars for one hex byte */
+ maxlen = 1 + strlen(buffer) / 2; /* at least 2 chars for one hex byte */
if (!get_file_tmp_space( info, len + maxlen )) return 0;
if ((res = parse_hex( (unsigned char *)info->tmp + len, &maxlen, buffer )) == -1) goto error;
len += maxlen;
@@ -1259,6 +1260,11 @@ static int load_value( struct key *key, const char *buffer, struct file_load_inf
error:
file_read_error( "Malformed value", info );
+ free( value->data );
+ value->data = NULL;
+ value->len = 0;
+ value->type = REG_NONE;
+ make_dirty( key );
return 0;
}
More information about the wine-cvs
mailing list