advapi32: Remove always-true if statements from RegEnumValue[AW].

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
This commit is contained in:
Alex Henrie 2015-10-06 21:06:23 -06:00 committed by Alexandre Julliard
parent 1eef1299f5
commit 18b7ec9479
1 changed files with 84 additions and 96 deletions

View File

@ -1940,53 +1940,45 @@ LSTATUS WINAPI RegEnumValueW( HKEY hkey, DWORD index, LPWSTR value, LPDWORD val_
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation, status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
buffer, total_size, &total_size ); buffer, total_size, &total_size );
if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
if (value || data) /* retry with a dynamically allocated buffer */
while (status == STATUS_BUFFER_OVERFLOW)
{ {
/* retry with a dynamically allocated buffer */ if (buf_ptr != buffer) heap_free( buf_ptr );
while (status == STATUS_BUFFER_OVERFLOW) if (!(buf_ptr = heap_alloc( total_size )))
return ERROR_NOT_ENOUGH_MEMORY;
info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr;
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
buf_ptr, total_size, &total_size );
}
if (status) goto done;
if (info->NameLength/sizeof(WCHAR) >= *val_count)
{
status = STATUS_BUFFER_OVERFLOW;
goto overflow;
}
memcpy( value, info->Name, info->NameLength );
*val_count = info->NameLength / sizeof(WCHAR);
value[*val_count] = 0;
if (data)
{
if (total_size - info->DataOffset > *count)
{ {
if (buf_ptr != buffer) heap_free( buf_ptr ); status = STATUS_BUFFER_OVERFLOW;
if (!(buf_ptr = heap_alloc( total_size ))) goto overflow;
return ERROR_NOT_ENOUGH_MEMORY;
info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr;
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
buf_ptr, total_size, &total_size );
} }
memcpy( data, buf_ptr + info->DataOffset, total_size - info->DataOffset );
if (status) goto done; if (total_size - info->DataOffset <= *count-sizeof(WCHAR) && is_string(info->Type))
if (value)
{ {
if (info->NameLength/sizeof(WCHAR) >= *val_count) /* if the type is REG_SZ and data is not 0-terminated
{ * and there is enough space in the buffer NT appends a \0 */
status = STATUS_BUFFER_OVERFLOW; WCHAR *ptr = (WCHAR *)(data + total_size - info->DataOffset);
goto overflow; if (ptr > (WCHAR *)data && ptr[-1]) *ptr = 0;
}
memcpy( value, info->Name, info->NameLength );
*val_count = info->NameLength / sizeof(WCHAR);
value[*val_count] = 0;
}
if (data)
{
if (total_size - info->DataOffset > *count)
{
status = STATUS_BUFFER_OVERFLOW;
goto overflow;
}
memcpy( data, buf_ptr + info->DataOffset, total_size - info->DataOffset );
if (total_size - info->DataOffset <= *count-sizeof(WCHAR) && is_string(info->Type))
{
/* if the type is REG_SZ and data is not 0-terminated
* and there is enough space in the buffer NT appends a \0 */
WCHAR *ptr = (WCHAR *)(data + total_size - info->DataOffset);
if (ptr > (WCHAR *)data && ptr[-1]) *ptr = 0;
}
} }
} }
else status = STATUS_SUCCESS;
overflow: overflow:
if (type) *type = info->Type; if (type) *type = info->Type;
@ -2025,74 +2017,70 @@ LSTATUS WINAPI RegEnumValueA( HKEY hkey, DWORD index, LPSTR value, LPDWORD val_c
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation, status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
buffer, total_size, &total_size ); buffer, total_size, &total_size );
if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
/* we need to fetch the contents for a string type even if not requested, /* we need to fetch the contents for a string type even if not requested,
* because we need to compute the length of the ASCII string. */ * because we need to compute the length of the ASCII string. */
if (value || data || is_string(info->Type))
/* retry with a dynamically allocated buffer */
while (status == STATUS_BUFFER_OVERFLOW)
{ {
/* retry with a dynamically allocated buffer */ if (buf_ptr != buffer) heap_free( buf_ptr );
while (status == STATUS_BUFFER_OVERFLOW) if (!(buf_ptr = heap_alloc( total_size )))
{ return ERROR_NOT_ENOUGH_MEMORY;
if (buf_ptr != buffer) heap_free( buf_ptr ); info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr;
if (!(buf_ptr = heap_alloc( total_size ))) status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
return ERROR_NOT_ENOUGH_MEMORY; buf_ptr, total_size, &total_size );
info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr; }
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
buf_ptr, total_size, &total_size );
}
if (status) goto done; if (status) goto done;
if (is_string(info->Type)) if (is_string(info->Type))
{
DWORD len;
RtlUnicodeToMultiByteSize( &len, (WCHAR *)(buf_ptr + info->DataOffset),
total_size - info->DataOffset );
if (data && len)
{ {
DWORD len; if (len > *count) status = STATUS_BUFFER_OVERFLOW;
RtlUnicodeToMultiByteSize( &len, (WCHAR *)(buf_ptr + info->DataOffset),
total_size - info->DataOffset );
if (data && len)
{
if (len > *count) status = STATUS_BUFFER_OVERFLOW;
else
{
RtlUnicodeToMultiByteN( (char*)data, len, NULL, (WCHAR *)(buf_ptr + info->DataOffset),
total_size - info->DataOffset );
/* if the type is REG_SZ and data is not 0-terminated
* and there is enough space in the buffer NT appends a \0 */
if (len < *count && data[len-1]) data[len] = 0;
}
}
info->DataLength = len;
}
else if (data)
{
if (total_size - info->DataOffset > *count) status = STATUS_BUFFER_OVERFLOW;
else memcpy( data, buf_ptr + info->DataOffset, total_size - info->DataOffset );
}
if (value && !status)
{
DWORD len;
RtlUnicodeToMultiByteSize( &len, info->Name, info->NameLength );
if (len >= *val_count)
{
status = STATUS_BUFFER_OVERFLOW;
if (*val_count)
{
len = *val_count - 1;
RtlUnicodeToMultiByteN( value, len, NULL, info->Name, info->NameLength );
value[len] = 0;
}
}
else else
{ {
RtlUnicodeToMultiByteN( value, len, NULL, info->Name, info->NameLength ); RtlUnicodeToMultiByteN( (char*)data, len, NULL, (WCHAR *)(buf_ptr + info->DataOffset),
value[len] = 0; total_size - info->DataOffset );
*val_count = len; /* if the type is REG_SZ and data is not 0-terminated
* and there is enough space in the buffer NT appends a \0 */
if (len < *count && data[len-1]) data[len] = 0;
} }
} }
info->DataLength = len;
}
else if (data)
{
if (total_size - info->DataOffset > *count) status = STATUS_BUFFER_OVERFLOW;
else memcpy( data, buf_ptr + info->DataOffset, total_size - info->DataOffset );
}
if (!status)
{
DWORD len;
RtlUnicodeToMultiByteSize( &len, info->Name, info->NameLength );
if (len >= *val_count)
{
status = STATUS_BUFFER_OVERFLOW;
if (*val_count)
{
len = *val_count - 1;
RtlUnicodeToMultiByteN( value, len, NULL, info->Name, info->NameLength );
value[len] = 0;
}
}
else
{
RtlUnicodeToMultiByteN( value, len, NULL, info->Name, info->NameLength );
value[len] = 0;
*val_count = len;
}
} }
else status = STATUS_SUCCESS;
if (type) *type = info->Type; if (type) *type = info->Type;
if (count) *count = info->DataLength; if (count) *count = info->DataLength;