reg: Fail if the data value passed with REG_DWORD will cause an overflow

Hugh McMaster hugh.mcmaster at outlook.com
Fri Feb 19 05:18:49 CST 2016


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

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 7dc624a..43e81f2 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -243,8 +243,17 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
         {
             LPWSTR rest;
             DWORD val;
+            BOOL overflow = FALSE;
+            if (data[1] == 'x')
+            {
+                WCHAR *ptr = &data[2];
+                while (*ptr == '0')
+                    ptr++;
+                if (strlenW(ptr) > 8)
+                    overflow = TRUE;
+            }
             val = strtoulW(data, &rest, (data[1] == 'x') ? 16 : 10);
-            if (*rest || data[0] == '-') {
+            if (*rest || data[0] == '-' || overflow) {
                 output_message(STRING_MISSING_INTEGER);
                 break;
             }
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index a813de1..6855aab 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -288,7 +288,7 @@ static void test_add(void)
     ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %u\n", r);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword8 /t REG_dword /d 0x01ffffffff /f", &r);
-    todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %d\n", r);
+    ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %d\n", r);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword12 /t REG_DWORD /d 0xffffffff /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-- 
1.9.1




More information about the wine-patches mailing list