Module: wine Branch: master Commit: 7f11a24fee2ffe538b6991b6d57dad618485acee URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f11a24fee2ffe538b6991b6d5...
Author: Hugh McMaster hugh.mcmaster@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@outlook.com Signed-off-by: Alexandre Julliard julliard@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"