[Python-checkins] cpython (3.6): Issue #25778: winreg does not truncase string correctly (Patch by Eryk Sun)

steve.dower python-checkins at python.org
Sat Dec 17 16:32:22 EST 2016


https://hg.python.org/cpython/rev/8cee4862fb34
changeset:   105716:8cee4862fb34
branch:      3.6
parent:      105712:a8d15e133778
user:        Steve Dower <steve.dower at microsoft.com>
date:        Sat Dec 17 13:30:27 2016 -0800
summary:
  Issue #25778: winreg does not truncase string correctly (Patch by Eryk Sun)

files:
  Lib/test/test_winreg.py |  14 +++++++++++++-
  Misc/NEWS               |   2 ++
  PC/winreg.c             |  13 ++++++-------
  3 files changed, 21 insertions(+), 8 deletions(-)


diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py
--- a/Lib/test/test_winreg.py
+++ b/Lib/test/test_winreg.py
@@ -57,7 +57,7 @@
 
     def delete_tree(self, root, subkey):
         try:
-            hkey = OpenKey(root, subkey, KEY_ALL_ACCESS)
+            hkey = OpenKey(root, subkey, 0, KEY_ALL_ACCESS)
         except OSError:
             # subkey does not exist
             return
@@ -368,6 +368,18 @@
         finally:
             DeleteKey(HKEY_CURRENT_USER, test_key_name)
 
+    def test_read_string_containing_null(self):
+        # Test for issue 25778: REG_SZ should not contain null characters
+        try:
+            with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck:
+                self.assertNotEqual(ck.handle, 0)
+                test_val = "A string\x00 with a null"
+                SetValueEx(ck, "test_name", 0, REG_SZ, test_val)
+                ret_val, ret_type = QueryValueEx(ck, "test_name")
+                self.assertEqual(ret_type, REG_SZ)
+                self.assertEqual(ret_val, "A string")
+        finally:
+            DeleteKey(HKEY_CURRENT_USER, test_key_name)
 
 
 @unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests")
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -49,6 +49,8 @@
 Windows
 -------
 
+- Issue #25778: winreg does not truncase string correctly (Patch by Eryk Sun)
+
 - Issue #28896: Deprecate WindowsRegistryFinder and disable it by default.
 
 Tests
diff --git a/PC/winreg.c b/PC/winreg.c
--- a/PC/winreg.c
+++ b/PC/winreg.c
@@ -719,14 +719,13 @@
         case REG_SZ:
         case REG_EXPAND_SZ:
             {
-                /* the buffer may or may not have a trailing NULL */
+                /* REG_SZ should be a NUL terminated string, but only by
+                 * convention. The buffer may have been saved without a NUL
+                 * or with embedded NULs. To be consistent with reg.exe and
+                 * regedit.exe, consume only up to the first NUL. */
                 wchar_t *data = (wchar_t *)retDataBuf;
-                int len = retDataSize / 2;
-                if (retDataSize && data[len-1] == '\0')
-                    retDataSize -= 2;
-                if (retDataSize <= 0)
-                    data = L"";
-                obData = PyUnicode_FromWideChar(data, retDataSize/2);
+                size_t len = wcsnlen(data, retDataSize / sizeof(wchar_t));
+                obData = PyUnicode_FromWideChar(data, len);
                 break;
             }
         case REG_MULTI_SZ:

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list