[PATCH 1/3] reg: Use a helper function to allocate memory and die on failure
Hugh McMaster
hugh.mcmaster at outlook.com
Tue Aug 1 07:30:51 CDT 2017
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
programs/reg/reg.c | 86 +++++++++++++++++++++---------------------------------
1 file changed, 33 insertions(+), 53 deletions(-)
diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 573c75040a..db4ae9bcf6 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -17,9 +17,10 @@
*/
#include <windows.h>
+#include <errno.h>
+#include <stdlib.h>
#include <wine/unicode.h>
#include <wine/debug.h>
-#include <errno.h>
#include "reg.h"
#define ARRAY_SIZE(A) (sizeof(A)/sizeof(*A))
@@ -78,6 +79,17 @@ type_rels[] =
{REG_MULTI_SZ, type_multi_sz},
};
+static void *heap_xalloc(size_t size)
+{
+ void *buf = HeapAlloc(GetProcessHeap(), 0, size);
+ if (!buf)
+ {
+ ERR("Out of memory!\n");
+ exit(1);
+ }
+ return buf;
+}
+
static void output_writeconsole(const WCHAR *str, DWORD wlen)
{
DWORD count, ret;
@@ -93,8 +105,7 @@ static void output_writeconsole(const WCHAR *str, DWORD wlen)
* one in that case.
*/
len = WideCharToMultiByte(GetConsoleOutputCP(), 0, str, wlen, NULL, 0, NULL, NULL);
- msgA = HeapAlloc(GetProcessHeap(), 0, len * sizeof(char));
- if (!msgA) return;
+ msgA = heap_xalloc(len);
WideCharToMultiByte(GetConsoleOutputCP(), 0, str, wlen, msgA, len, NULL, NULL);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE);
@@ -240,7 +251,7 @@ static LPBYTE get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DW
case REG_EXPAND_SZ:
{
*reg_count = (lstrlenW(data) + 1) * sizeof(WCHAR);
- out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
+ out_data = heap_xalloc(*reg_count);
lstrcpyW((LPWSTR)out_data,data);
break;
}
@@ -256,7 +267,7 @@ static LPBYTE get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DW
break;
}
*reg_count = sizeof(DWORD);
- out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
+ out_data = heap_xalloc(*reg_count);
((LPDWORD)out_data)[0] = val;
break;
}
@@ -265,7 +276,7 @@ static LPBYTE get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DW
BYTE hex0, hex1;
int i = 0, destByteIndex = 0, datalen = lstrlenW(data);
*reg_count = ((datalen + datalen % 2) / 2) * sizeof(BYTE);
- out_data = HeapAlloc(GetProcessHeap(), 0, *reg_count);
+ out_data = heap_xalloc(*reg_count);
if(datalen % 2)
{
hex1 = hexchar_to_byte(data[i++]);
@@ -292,7 +303,7 @@ static LPBYTE get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DW
case REG_MULTI_SZ:
{
int i, destindex, len = strlenW(data);
- WCHAR *buffer = HeapAlloc(GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR));
+ WCHAR *buffer = heap_xalloc((len + 2) * sizeof(WCHAR));
for (i = 0, destindex = 0; i < len; i++, destindex++)
{
@@ -462,7 +473,7 @@ static int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name
return 1;
}
maxValue++;
- szValue = HeapAlloc(GetProcessHeap(),0,maxValue*sizeof(WCHAR));
+ szValue = heap_xalloc(maxValue * sizeof(WCHAR));
while (1)
{
@@ -507,7 +518,7 @@ static WCHAR *reg_data_to_wchar(DWORD type, const BYTE *src, DWORD size_bytes)
{
case REG_SZ:
case REG_EXPAND_SZ:
- buffer = HeapAlloc(GetProcessHeap(), 0, size_bytes);
+ buffer = heap_xalloc(size_bytes);
strcpyW(buffer, (WCHAR *)src);
break;
case REG_NONE:
@@ -516,7 +527,7 @@ static WCHAR *reg_data_to_wchar(DWORD type, const BYTE *src, DWORD size_bytes)
WCHAR *ptr;
WCHAR fmt[] = {'%','0','2','X',0};
- buffer = HeapAlloc(GetProcessHeap(), 0, (size_bytes * 2 + 1) * sizeof(WCHAR));
+ buffer = heap_xalloc((size_bytes * 2 + 1) * sizeof(WCHAR));
ptr = buffer;
for (i = 0; i < size_bytes; i++)
ptr += sprintfW(ptr, fmt, src[i]);
@@ -529,7 +540,7 @@ static WCHAR *reg_data_to_wchar(DWORD type, const BYTE *src, DWORD size_bytes)
const int zero_x_dword = 10;
WCHAR fmt[] = {'0','x','%','x',0};
- buffer = HeapAlloc(GetProcessHeap(), 0, (zero_x_dword + 1) * sizeof(WCHAR));
+ buffer = heap_xalloc((zero_x_dword + 1) * sizeof(WCHAR));
sprintfW(buffer, fmt, *(DWORD *)src);
break;
}
@@ -542,13 +553,13 @@ static WCHAR *reg_data_to_wchar(DWORD type, const BYTE *src, DWORD size_bytes)
if (size_bytes <= two_wchars)
{
- buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR));
+ buffer = heap_xalloc(sizeof(WCHAR));
*buffer = 0;
return buffer;
}
tmp_size = size_bytes - two_wchars; /* exclude both null terminators */
- buffer = HeapAlloc(GetProcessHeap(), 0, tmp_size * 2 + sizeof(WCHAR));
+ buffer = heap_xalloc(tmp_size * 2 + sizeof(WCHAR));
len = tmp_size / sizeof(WCHAR);
for (i = 0, destindex = 0; i < len; i++, destindex++)
@@ -615,13 +626,9 @@ static WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name,
WCHAR *subkey_path;
WCHAR fmt[] = {'%','s','\\','%','s',0};
- subkey_path = HeapAlloc(GetProcessHeap(), 0, (path_len + subkey_len + 2) * sizeof(WCHAR));
- if (!subkey_path)
- {
- ERR("Failed to allocate memory for subkey_path\n");
- return NULL;
- }
+ subkey_path = heap_xalloc((path_len + subkey_len + 2) * sizeof(WCHAR));
sprintfW(subkey_path, fmt, path, subkey_name);
+
return subkey_path;
}
@@ -641,12 +648,7 @@ static int query_value(HKEY key, WCHAR *value_name, WCHAR *path, BOOL recurse)
WCHAR *subkey_name, *subkey_path;
HKEY subkey;
- data = HeapAlloc(GetProcessHeap(), 0, max_data_bytes);
- if (!data)
- {
- ERR("Failed to allocate memory for data\n");
- return 1;
- }
+ data = heap_xalloc(max_data_bytes);
for (;;)
{
@@ -685,12 +687,7 @@ static int query_value(HKEY key, WCHAR *value_name, WCHAR *path, BOOL recurse)
return 0;
}
- subkey_name = HeapAlloc(GetProcessHeap(), 0, MAX_SUBKEY_LEN * sizeof(WCHAR));
- if (!subkey_name)
- {
- ERR("Failed to allocate memory for subkey_name\n");
- return 1;
- }
+ subkey_name = heap_xalloc(MAX_SUBKEY_LEN * sizeof(WCHAR));
path_len = strlenW(path);
@@ -733,20 +730,8 @@ static int query_all(HKEY key, WCHAR *path, BOOL recurse)
output_string(fmt, path);
- value_name = HeapAlloc(GetProcessHeap(), 0, max_value_len * sizeof(WCHAR));
- if (!value_name)
- {
- ERR("Failed to allocate memory for value_name\n");
- return 1;
- }
-
- data = HeapAlloc(GetProcessHeap(), 0, max_data_bytes);
- if (!data)
- {
- HeapFree(GetProcessHeap(), 0, value_name);
- ERR("Failed to allocate memory for data\n");
- return 1;
- }
+ value_name = heap_xalloc(max_value_len * sizeof(WCHAR));
+ data = heap_xalloc(max_data_bytes);
i = 0;
for (;;)
@@ -781,12 +766,7 @@ static int query_all(HKEY key, WCHAR *path, BOOL recurse)
if (i || recurse)
output_string(newlineW);
- subkey_name = HeapAlloc(GetProcessHeap(), 0, MAX_SUBKEY_LEN * sizeof(WCHAR));
- if (!subkey_name)
- {
- ERR("Failed to allocate memory for subkey_name\n");
- return 1;
- }
+ subkey_name = heap_xalloc(MAX_SUBKEY_LEN * sizeof(WCHAR));
path_len = strlenW(path);
@@ -866,13 +846,13 @@ static WCHAR *get_long_key(HKEY root, WCHAR *path)
if (!path)
{
- long_key = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+ long_key = heap_xalloc((len + 1) * sizeof(WCHAR));
strcpyW(long_key, root_rels[i].long_name);
return long_key;
}
len += strlenW(path) + 1; /* add one for the backslash */
- long_key = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+ long_key = heap_xalloc((len + 1) * sizeof(WCHAR));
sprintfW(long_key, fmt, root_rels[i].long_name, path);
return long_key;
}
--
2.13.2
More information about the wine-patches
mailing list