Hugh McMaster : reg: Allow the 'reg_data' pointer to be NULL.
Alexandre Julliard
julliard at winehq.org
Thu May 6 14:56:19 CDT 2021
Module: wine
Branch: master
Commit: e2dfb0aff42153f2c1a25e8c9b37ad10409aca36
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e2dfb0aff42153f2c1a25e8c9b37ad10409aca36
Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date: Thu May 6 22:47:53 2021 +1000
reg: Allow the 'reg_data' pointer to be NULL.
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/reg/add.c | 52 +++++++++++++++++++++++++++++-----------------------
1 file changed, 29 insertions(+), 23 deletions(-)
diff --git a/programs/reg/add.c b/programs/reg/add.c
index 9aaa3fc1acc..cb26c232de3 100644
--- a/programs/reg/add.c
+++ b/programs/reg/add.c
@@ -48,10 +48,10 @@ static inline BYTE hexchar_to_byte(WCHAR ch)
return -1;
}
-static BYTE *get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DWORD *size_bytes)
+static BOOL get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator,
+ BYTE **data_bytes, DWORD *size_bytes)
{
static const WCHAR empty;
- LPBYTE out_data = NULL;
*size_bytes = 0;
@@ -64,8 +64,8 @@ static BYTE *get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DWO
case REG_EXPAND_SZ:
{
*size_bytes = (lstrlenW(data) + 1) * sizeof(WCHAR);
- out_data = malloc(*size_bytes);
- lstrcpyW((LPWSTR)out_data,data);
+ *data_bytes = malloc(*size_bytes);
+ lstrcpyW((WCHAR *)*data_bytes, data);
break;
}
case REG_DWORD:
@@ -77,41 +77,46 @@ static BYTE *get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DWO
val = wcstoul(data, &rest, (towlower(data[1]) == 'x') ? 16 : 10);
if (*rest || data[0] == '-' || (val == ~0u && errno == ERANGE)) {
output_message(STRING_MISSING_INTEGER);
- break;
+ return FALSE;
}
*size_bytes = sizeof(DWORD);
- out_data = malloc(*size_bytes);
- ((LPDWORD)out_data)[0] = val;
+ *data_bytes = malloc(*size_bytes);
+ *(DWORD *)*data_bytes = val;
break;
}
case REG_BINARY:
{
- BYTE hex0, hex1;
+ BYTE hex0, hex1, *ptr;
int i = 0, destByteIndex = 0, datalen = lstrlenW(data);
+
*size_bytes = ((datalen + datalen % 2) / 2) * sizeof(BYTE);
- out_data = malloc(*size_bytes);
- if(datalen % 2)
+ *data_bytes = malloc(*size_bytes);
+
+ if (datalen % 2)
{
hex1 = hexchar_to_byte(data[i++]);
- if(hex1 == 0xFF)
+ if (hex1 == 0xFF)
goto no_hex_data;
- out_data[destByteIndex++] = hex1;
+ *data_bytes[destByteIndex++] = hex1;
}
- for(;i + 1 < datalen;i += 2)
+
+ ptr = *data_bytes;
+
+ for (; i + 1 < datalen; i += 2)
{
hex0 = hexchar_to_byte(data[i]);
hex1 = hexchar_to_byte(data[i + 1]);
- if(hex0 == 0xFF || hex1 == 0xFF)
+ if (hex0 == 0xFF || hex1 == 0xFF)
goto no_hex_data;
- out_data[destByteIndex++] = (hex0 << 4) | hex1;
+ ptr[destByteIndex++] = (hex0 << 4) | hex1;
}
break;
+
no_hex_data:
- /* cleanup, print error */
- free(out_data);
+ free(*data_bytes);
+ *data_bytes = NULL;
output_message(STRING_MISSING_HEXDATA);
- out_data = NULL;
- break;
+ return FALSE;
}
case REG_MULTI_SZ:
{
@@ -134,20 +139,21 @@ static BYTE *get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DWO
{
free(buffer);
output_message(STRING_INVALID_STRING);
- return NULL;
+ return FALSE;
}
}
buffer[destindex] = 0;
if (destindex && buffer[destindex - 1])
buffer[++destindex] = 0;
*size_bytes = (destindex + 1) * sizeof(WCHAR);
- return (BYTE *)buffer;
+ *data_bytes = (BYTE *)buffer;
+ break;
}
default:
output_message(STRING_UNHANDLED_TYPE, reg_type, data);
}
- return out_data;
+ return TRUE;
}
static int run_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty,
@@ -194,7 +200,7 @@ static int run_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty,
return 1;
}
- if (!(reg_data = get_regdata(data, data_type, separator, &data_size)))
+ if (!get_regdata(data, data_type, separator, ®_data, &data_size))
{
RegCloseKey(hkey);
return 1;
More information about the wine-cvs
mailing list