Issue #25778: winreg does not truncase string correctly (Patch by Eryk Sun)

This commit is contained in:
Steve Dower 2016-12-17 13:30:27 -08:00
parent ce042af3fe
commit 40fa26606d
3 changed files with 21 additions and 8 deletions

View File

@ -57,7 +57,7 @@ class BaseWinregTests(unittest.TestCase):
def delete_tree(self, root, subkey): def delete_tree(self, root, subkey):
try: try:
hkey = OpenKey(root, subkey, KEY_ALL_ACCESS) hkey = OpenKey(root, subkey, 0, KEY_ALL_ACCESS)
except OSError: except OSError:
# subkey does not exist # subkey does not exist
return return
@ -368,6 +368,18 @@ class LocalWinregTests(BaseWinregTests):
finally: finally:
DeleteKey(HKEY_CURRENT_USER, test_key_name) 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") @unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests")

View File

@ -49,6 +49,8 @@ Library
Windows Windows
------- -------
- Issue #25778: winreg does not truncase string correctly (Patch by Eryk Sun)
- Issue #28896: Deprecate WindowsRegistryFinder and disable it by default. - Issue #28896: Deprecate WindowsRegistryFinder and disable it by default.
Tests Tests

View File

@ -719,14 +719,13 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
case REG_SZ: case REG_SZ:
case REG_EXPAND_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; wchar_t *data = (wchar_t *)retDataBuf;
int len = retDataSize / 2; size_t len = wcsnlen(data, retDataSize / sizeof(wchar_t));
if (retDataSize && data[len-1] == '\0') obData = PyUnicode_FromWideChar(data, len);
retDataSize -= 2;
if (retDataSize <= 0)
data = L"";
obData = PyUnicode_FromWideChar(data, retDataSize/2);
break; break;
} }
case REG_MULTI_SZ: case REG_MULTI_SZ: