[PATCH 4/5] reg: Use a helper function to allocate and re-allocate memory

Hugh McMaster hugh.mcmaster at outlook.com
Mon Jul 24 07:48:05 CDT 2017


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/reg.c  | 76 ++++++++++++++++++++++++-----------------------------
 programs/reg/reg.h  |  1 +
 programs/reg/reg.rc |  1 +
 3 files changed, 36 insertions(+), 42 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 573c75040a..6d48dece05 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -17,9 +17,12 @@
  */
 
 #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))
@@ -174,6 +177,26 @@ static BOOL ask_confirm(unsigned int msgid, WCHAR *reg_info)
     }
 }
 
+#define CHECK_ENOUGH_MEMORY(p) \
+if (!(p)) \
+{ \
+    output_message(STRING_OUT_OF_MEMORY, __FILE__, __LINE__); \
+    exit(1); \
+}
+
+static void *resize_buffer(void *buf, size_t count)
+{
+    void *new_buf;
+
+    if (buf)
+        new_buf = HeapReAlloc(GetProcessHeap(), 0, buf, count);
+    else
+        new_buf = HeapAlloc(GetProcessHeap(), 0, count);
+
+    CHECK_ENOUGH_MEMORY(new_buf);
+    return new_buf;
+}
+
 static inline BOOL path_rootname_cmp(const WCHAR *input_path, const WCHAR *rootkey_name)
 {
     DWORD length = strlenW(rootkey_name);
@@ -615,13 +638,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 = resize_buffer(NULL, (path_len + subkey_len + 2) * sizeof(WCHAR));
     sprintfW(subkey_path, fmt, path, subkey_name);
+
     return subkey_path;
 }
 
@@ -641,12 +660,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 = resize_buffer(NULL, max_data_bytes);
 
     for (;;)
     {
@@ -655,7 +669,7 @@ static int query_value(HKEY key, WCHAR *value_name, WCHAR *path, BOOL recurse)
         if (rc == ERROR_MORE_DATA)
         {
             max_data_bytes = data_size;
-            data = HeapReAlloc(GetProcessHeap(), 0, data, max_data_bytes);
+            data = resize_buffer(data, max_data_bytes);
         }
         else break;
     }
@@ -685,12 +699,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 = resize_buffer(NULL, MAX_SUBKEY_LEN * sizeof(WCHAR));
 
     path_len = strlenW(path);
 
@@ -733,20 +742,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 = resize_buffer(NULL, max_value_len * sizeof(WCHAR));
+    data = resize_buffer(NULL, max_data_bytes);
 
     i = 0;
     for (;;)
@@ -764,12 +761,12 @@ static int query_all(HKEY key, WCHAR *path, BOOL recurse)
             if (data_size > max_data_bytes)
             {
                 max_data_bytes = data_size;
-                data = HeapReAlloc(GetProcessHeap(), 0, data, max_data_bytes);
+                data = resize_buffer(data, max_data_bytes);
             }
             else
             {
                 max_value_len *= 2;
-                value_name = HeapReAlloc(GetProcessHeap(), 0, value_name, max_value_len * sizeof(WCHAR));
+                value_name = resize_buffer(value_name, max_value_len * sizeof(WCHAR));
             }
         }
         else break;
@@ -781,12 +778,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 = resize_buffer(NULL, MAX_SUBKEY_LEN * sizeof(WCHAR));
 
     path_len = strlenW(path);
 
diff --git a/programs/reg/reg.h b/programs/reg/reg.h
index 1142278a19..212e8d2f2e 100644
--- a/programs/reg/reg.h
+++ b/programs/reg/reg.h
@@ -52,3 +52,4 @@
 #define STRING_REG_HELP         129
 #define STRING_FUNC_HELP        130
 #define STRING_VALUE_NOT_SET    131
+#define STRING_OUT_OF_MEMORY    132
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
index ae69cb7adf..e76c08e84b 100644
--- a/programs/reg/reg.rc
+++ b/programs/reg/reg.rc
@@ -62,4 +62,5 @@ STRINGTABLE
     STRING_REG_HELP, "Type \"REG /?\" for help.\n"
     STRING_FUNC_HELP, "Type \"REG %1 /?\" for help.\n"
     STRING_VALUE_NOT_SET, "(value not set)"
+    STRING_OUT_OF_MEMORY, "reg: Out of memory! (%1!S!, line %2!u!)\n"
 }
-- 
2.13.2




More information about the wine-patches mailing list