From 8c537f03dd3a32b887541168252d7cd8e13154a1 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sat, 17 Dec 2016 13:30:27 -0800 Subject: Issue #25778: winreg does not truncase string correctly (Patch by Eryk Sun) --- PC/winreg.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'PC') diff --git a/PC/winreg.c b/PC/winreg.c index 9524838c08..5efdc5e0ef 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -719,14 +719,13 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ) 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: -- cgit v1.2.1