[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