Hugh McMaster : regedit: Parse UTF-16 file header for validation.

Alexandre Julliard julliard at winehq.org
Wed Mar 22 15:52:35 CDT 2017


Module: wine
Branch: master
Commit: e1e79d12b3b8f455801e1356e4e10c8067cd5a54
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e1e79d12b3b8f455801e1356e4e10c8067cd5a54

Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date:   Wed Mar 22 11:53:53 2017 +0000

regedit: Parse UTF-16 file header for validation.

Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/regedit/regproc.c | 47 ++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index a88f632..a88ca75 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -646,11 +646,34 @@ static void processRegEntry31(WCHAR *line)
     closeKey();
 }
 
-/* version constants */
+enum reg_versions {
+    REG_VERSION_31,
+    REG_VERSION_40,
+    REG_VERSION_50,
+    REG_VERSION_INVALID
+};
+
+static enum reg_versions parse_file_header(WCHAR *s)
+{
+    static const WCHAR header_31[] = {'R','E','G','E','D','I','T',0};
+    static const WCHAR header_40[] = {'R','E','G','E','D','I','T','4',0};
+    static const WCHAR header_50[] = {'W','i','n','d','o','w','s',' ',
+                                      'R','e','g','i','s','t','r','y',' ','E','d','i','t','o','r',' ',
+                                      'V','e','r','s','i','o','n',' ','5','.','0','0',0};
+
+    while (*s && (*s == ' ' || *s == '\t')) s++;
 
-#define REG_VERSION_31  3
-#define REG_VERSION_40  4
-#define REG_VERSION_50  5
+    if (!strcmpW(s, header_31))
+        return REG_VERSION_31;
+
+    if (!strcmpW(s, header_40))
+        return REG_VERSION_40;
+
+    if (!strcmpW(s, header_50))
+        return REG_VERSION_50;
+
+    return REG_VERSION_INVALID;
+}
 
 /******************************************************************************
  * Processes a registry file.
@@ -799,6 +822,13 @@ static WCHAR *get_lineW(FILE *fp)
     static WCHAR *buf, *next;
     WCHAR *line;
 
+    if (!fp)
+    {
+        if (size) HeapFree(GetProcessHeap(), 0, buf);
+        size = 0;
+        return NULL;
+    }
+
     if (!size)
     {
         size = REG_VAL_BUF_SIZE;
@@ -861,6 +891,15 @@ static WCHAR *get_lineW(FILE *fp)
 static void processRegLinesW(FILE *fp)
 {
     WCHAR *line;
+    int reg_version;
+
+    line = get_lineW(fp);
+    reg_version = parse_file_header(line);
+    if (reg_version == REG_VERSION_INVALID)
+    {
+        get_lineW(NULL); /* Reset static variables */
+        return;
+    }
 
     while ((line = get_lineW(fp)))
         processRegEntry(line, TRUE);




More information about the wine-cvs mailing list