reg: Correctly handle cases with no data argument

Hugh McMaster hugh.mcmaster at outlook.com
Tue Mar 15 03:58:56 CDT 2016


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/reg.c       | 35 +++++++++++++++++++++++++++++++----
 programs/reg/tests/reg.c | 20 ++++++++++----------
 2 files changed, 41 insertions(+), 14 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 164981d..0490ac7 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -236,6 +236,14 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
         case REG_SZ:
         case REG_EXPAND_SZ:
         {
+            if (!data)
+            {
+                *reg_count = sizeof(WCHAR);
+                out_data = HeapAlloc(GetProcessHeap(), 0, *reg_count);
+                memset(out_data, 0, *reg_count);
+                return out_data;
+            }
+
             *reg_count = (lstrlenW(data) + 1) * sizeof(WCHAR);
             out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
             lstrcpyW((LPWSTR)out_data,data);
@@ -260,7 +268,15 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
         case REG_BINARY:
         {
             BYTE hex0, hex1;
-            int i = 0, destByteIndex = 0, datalen = lstrlenW(data);
+            int i = 0, destByteIndex = 0, datalen;
+
+            if (!data)
+            {
+                out_data = HeapAlloc(GetProcessHeap(), 0, 0); /* We need a valid pointer */
+                return out_data;
+            }
+
+            datalen = strlenW(data);
             *reg_count = ((datalen + datalen % 2) / 2) * sizeof(BYTE);
             out_data = HeapAlloc(GetProcessHeap(), 0, *reg_count);
             if(datalen % 2)
@@ -288,8 +304,19 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
         }
         case REG_MULTI_SZ:
         {
-            int i, destindex, len = strlenW(data);
-            WCHAR *buffer = HeapAlloc(GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR));
+            int i, destindex, len;
+            WCHAR *buffer;
+
+            if (!data)
+            {
+                *reg_count = sizeof(WCHAR);
+                out_data = HeapAlloc(GetProcessHeap(), 0, *reg_count);
+                memset(out_data, 0, *reg_count);
+                return out_data;
+            }
+
+            len = strlenW(data);
+            buffer = HeapAlloc(GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR));
 
             for (i = 0, destindex = 0; i < len; i++, destindex++)
             {
@@ -411,7 +438,7 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
              return 1;
         }
 
-        if (data && !(reg_data = get_regdata(data, reg_type, separator, &reg_count)))
+        if (!(reg_data = get_regdata(data, reg_type, separator, &reg_count)))
         {
             RegCloseKey(subkey);
             return 1;
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index 4089367..6a55537 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -147,11 +147,11 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v none1 /t REG_NONE /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
-    verify_reg(hkey, "none1", REG_NONE, "\0", 2, TODO_REG_SIZE);
+    verify_reg(hkey, "none1", REG_NONE, "\0", 2, 0);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /t REG_NONE /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
-    verify_reg(hkey, NULL, REG_NONE, "\0", 2, TODO_REG_SIZE);
+    verify_reg(hkey, NULL, REG_NONE, "\0", 2, 0);
 
     /* REG_SZ */
     run_reg_exe("reg add HKCU\\" KEY_BASE " /d WineTest /f", &r);
@@ -168,7 +168,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v test /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg(hkey, "test", REG_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, "test", REG_SZ, "", 1, 0);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v test1 /t REG_SZ /f /d", &r);
     ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
@@ -179,7 +179,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_SZ /v test2 /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg(hkey, "test2", REG_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, "test2", REG_SZ, "", 1, 0);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_SZ /v test3 /f /d \"\"", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
@@ -187,11 +187,11 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
-    verify_reg(hkey, NULL, REG_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, NULL, REG_SZ, "", 1, 0);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /t REG_SZ /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
-    verify_reg(hkey, NULL, REG_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, NULL, REG_SZ, "", 1, 0);
 
     /* REG_EXPAND_SZ */
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v expand0 /t REG_EXpand_sz /d \"dead%PATH%beef\" /f", &r);
@@ -204,7 +204,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_EXPAND_SZ /v expand2 /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
-    verify_reg(hkey, "expand2", REG_EXPAND_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, "expand2", REG_EXPAND_SZ, "", 1, 0);
 
     run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE " /ve /t REG_EXPAND_SZ /d WineTEST /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
@@ -216,7 +216,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /t REG_EXPAND_SZ /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
-    verify_reg(hkey, NULL, REG_EXPAND_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, NULL, REG_EXPAND_SZ, "", 1, 0);
 
     /* REG_BINARY */
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin0 /f", &r);
@@ -372,7 +372,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi3 /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
-    verify_reg(hkey, "multi3", REG_MULTI_SZ, &buffer[21], 1, TODO_REG_SIZE);
+    verify_reg(hkey, "multi3", REG_MULTI_SZ, &buffer[21], 1, 0);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi4 /s \"#\" /d \"threelittlestrings\" /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
@@ -435,7 +435,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /t REG_MULTI_SZ /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
-    verify_reg(hkey, NULL, REG_MULTI_SZ, buffer, 1, TODO_REG_SIZE);
+    verify_reg(hkey, NULL, REG_MULTI_SZ, buffer, 1, 0);
 
     RegCloseKey(hkey);
 
-- 
1.9.1




More information about the wine-patches mailing list