[PATCH 3/3] reg: Fail if the data for REG_MULTI_SZ contains two adjacent separators
Hugh McMaster
hugh.mcmaster at outlook.com
Thu Feb 25 02:54:10 CST 2016
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
programs/reg/reg.c | 10 ++++++++++
programs/reg/reg.h | 1 +
programs/reg/reg.rc | 1 +
programs/reg/tests/reg.c | 6 +++---
4 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index e66ba5a..009f035 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -294,9 +294,15 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
{
buffer[destindex] = 0;
i++;
+ if (data[i + 1] == '\\' && data[i + 2] == '0')
+ goto error_multi_sz;
}
else if (data[i] == separator)
+ {
buffer[destindex] = 0;
+ if (data[i + 1] == separator)
+ goto error_multi_sz;
+ }
else
buffer[destindex] = data[i];
}
@@ -305,6 +311,10 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
buffer[++destindex] = 0;
*reg_count = (destindex + 1) * sizeof(WCHAR);
return (BYTE *)buffer;
+ error_multi_sz:
+ if (buffer) HeapFree(GetProcessHeap(), 0, buffer);
+ output_message(STRING_INVALID_STRING);
+ break;
}
default:
output_message(STRING_UNHANDLED_TYPE, reg_type, data);
diff --git a/programs/reg/reg.h b/programs/reg/reg.h
index 592fec6..679c72e 100644
--- a/programs/reg/reg.h
+++ b/programs/reg/reg.h
@@ -43,3 +43,4 @@
#define STRING_DELETE_VALUE 120
#define STRING_DELETE_VALUEALL 121
#define STRING_DELETE_SUBKEY 122
+#define STRING_INVALID_STRING 123
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
index 9b239d1..d153758 100644
--- a/programs/reg/reg.rc
+++ b/programs/reg/reg.rc
@@ -48,4 +48,5 @@ STRINGTABLE
STRING_DELETE_VALUE, "Are you sure you want to delete the registry value '%1'?"
STRING_DELETE_VALUEALL, "Are you sure you want to delete all registry values in '%1'?"
STRING_DELETE_SUBKEY, "Are you sure you want to delete the registry key '%1'?"
+ STRING_INVALID_STRING, "reg: The option [/d] must be followed by a valid string\n"
}
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index efb2839..b5ae277 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -353,9 +353,9 @@ static void test_add(void)
run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi7 /s \"\" /d \"three#little#strings\" /f", &r);
ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi8 /s \"#\" /d \"##\" /f", &r);
- todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
+ ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi9 /s \"#\" /d \"two##strings\" /f", &r);
- todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
+ ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi10 /s \"#\" /d \"#a\" /f", &r);
todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
@@ -378,7 +378,7 @@ static void test_add(void)
verify_reg(hkey, "multi15", REG_MULTI_SZ, buffer, 3, 0);
run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi16 /d \"two\\0\\0strings\" /f", &r);
- todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r);
+ ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r);
run_reg_exe("reg add HKCU\\" KEY_BASE " /v multi17 /t REG_MULTI_SZ /s \"#\" /d \"#\" /f", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r);
--
1.9.1
More information about the wine-patches
mailing list