Hugh McMaster : regedit: Null-terminate REG_EXPAND_SZ and REG_MULTI_SZ hex data during concatenation if we reach EOF.
Alexandre Julliard
julliard at winehq.org
Mon Jul 10 15:52:47 CDT 2017
Module: wine
Branch: master
Commit: 7f11a24fee2ffe538b6991b6d57dad618485acee
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f11a24fee2ffe538b6991b6d57dad618485acee
Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date: Mon Jul 10 11:28:17 2017 +0000
regedit: Null-terminate REG_EXPAND_SZ and REG_MULTI_SZ hex data during concatenation if we reach EOF.
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/regedit/regproc.c | 40 +++++++++++++++++++++++-----------------
programs/regedit/tests/regedit.c | 4 ++--
2 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 0a356cb..ea0b6f8 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -504,6 +504,27 @@ static void free_parser_data(struct parser *parser)
parser->data_size = 0;
}
+static void prepare_hex_string_data(struct parser *parser)
+{
+ if (parser->data_type == REG_EXPAND_SZ || parser->data_type == REG_MULTI_SZ)
+ {
+ BYTE *data = parser->data;
+
+ if (data[parser->data_size - 1] != 0)
+ {
+ data[parser->data_size] = 0;
+ parser->data_size++;
+ }
+
+ if (!parser->is_unicode)
+ {
+ parser->data = GetWideStringN(parser->data, parser->data_size, &parser->data_size);
+ parser->data_size *= sizeof(WCHAR);
+ HeapFree(GetProcessHeap(), 0, data);
+ }
+ }
+}
+
enum reg_versions {
REG_VERSION_31,
REG_VERSION_40,
@@ -852,23 +873,7 @@ static WCHAR *hex_data_state(struct parser *parser, WCHAR *pos)
return line;
}
- if (parser->data_type == REG_EXPAND_SZ || parser->data_type == REG_MULTI_SZ)
- {
- BYTE *data = parser->data;
-
- if (data[parser->data_size - 1] != 0x00)
- {
- data[parser->data_size] = 0x00;
- parser->data_size++;
- }
-
- if (!parser->is_unicode)
- {
- parser->data = GetWideStringN(parser->data, parser->data_size, &parser->data_size);
- parser->data_size *= sizeof(WCHAR);
- HeapFree(GetProcessHeap(), 0, data);
- }
- }
+ prepare_hex_string_data(parser);
set_state(parser, SET_VALUE);
return line;
@@ -903,6 +908,7 @@ static WCHAR *hex_multiline_state(struct parser *parser, WCHAR *pos)
if (!(line = get_line(parser->file)))
{
+ prepare_hex_string_data(parser);
set_state(parser, SET_VALUE);
return pos;
}
diff --git a/programs/regedit/tests/regedit.c b/programs/regedit/tests/regedit.c
index b3f6e76..2839a11 100644
--- a/programs/regedit/tests/regedit.c
+++ b/programs/regedit/tests/regedit.c
@@ -500,7 +500,7 @@ static void test_basic_import(void)
exec_import_str("REGEDIT4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Wine17b\"=hex(2):25,50,41,54,48,25,\\");
- verify_reg(hkey, "Wine17b", REG_EXPAND_SZ, "%PATH%", 7, TODO_REG_SIZE | TODO_REG_DATA);
+ verify_reg(hkey, "Wine17b", REG_EXPAND_SZ, "%PATH%", 7, 0);
exec_import_str("REGEDIT4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
@@ -510,7 +510,7 @@ static void test_basic_import(void)
exec_import_str("REGEDIT4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Wine17d\"=hex(7):4c,69,6e,65,\\");
- verify_reg(hkey, "Wine17d", REG_MULTI_SZ, "Line", 5, TODO_REG_SIZE | TODO_REG_DATA);
+ verify_reg(hkey, "Wine17d", REG_MULTI_SZ, "Line", 5, 0);
exec_import_str("REGEDIT4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
More information about the wine-cvs
mailing list