diff options
author | Zackery Spytz <zspytz@gmail.com> | 2019-09-09 09:26:15 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@python.org> | 2019-09-09 09:26:15 (GMT) |
commit | e223ba13d8d871ee58570dfca4e82a591189cc2f (patch) | |
tree | cbdf0f05e6761391815d3522755980f169872250 /PC | |
parent | a6563650c835d50f7302971a5b145e94f9d0dc68 (diff) | |
download | cpython-e223ba13d8d871ee58570dfca4e82a591189cc2f.zip cpython-e223ba13d8d871ee58570dfca4e82a591189cc2f.tar.gz cpython-e223ba13d8d871ee58570dfca4e82a591189cc2f.tar.bz2 |
bpo-32587: Make winreg.REG_MULTI_SZ support zero-length strings (#13239)
* bpo-32587: Make winreg.REG_MULTI_SZ support PendingFileRenameOperations
* Address review comments.
Diffstat (limited to 'PC')
-rw-r--r-- | PC/winreg.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/PC/winreg.c b/PC/winreg.c index d0df7ef..37bc2c7 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -518,11 +518,18 @@ fixupMultiSZ(wchar_t **str, wchar_t *data, int len) int i; wchar_t *Q; - Q = data + len; - for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) { + if (len > 0 && data[len - 1] == '\0') { + Q = data + len - 1; + } + else { + Q = data + len; + } + + for (P = data, i = 0; P < Q; P++, i++) { str[i] = P; - for (; P < Q && *P != '\0'; P++) + for (; P < Q && *P != '\0'; P++) { ; + } } } @@ -530,12 +537,20 @@ static int countStrings(wchar_t *data, int len) { int strings; - wchar_t *P; - wchar_t *Q = data + len; + wchar_t *P, *Q; + + if (len > 0 && data[len - 1] == '\0') { + Q = data + len - 1; + } + else { + Q = data + len; + } - for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++) - for (; P < Q && *P != '\0'; P++) + for (P = data, strings = 0; P < Q; P++, strings++) { + for (; P < Q && *P != '\0'; P++) { ; + } + } return strings; } @@ -749,21 +764,15 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ) } for (index = 0; index < s; index++) { - size_t len = wcslen(str[index]); - if (len > INT_MAX) { - PyErr_SetString(PyExc_OverflowError, - "registry string is too long for a Python string"); - Py_DECREF(obData); - PyMem_Free(str); - return NULL; - } - PyObject *uni = PyUnicode_FromWideChar(str[index], len); + size_t slen = wcsnlen(str[index], len); + PyObject *uni = PyUnicode_FromWideChar(str[index], slen); if (uni == NULL) { Py_DECREF(obData); PyMem_Free(str); return NULL; } PyList_SET_ITEM(obData, index, uni); + len -= slen + 1; } PyMem_Free(str); |