Skip to content

Commit

Permalink
bpo-32587: Make winreg.REG_MULTI_SZ support zero-length strings (GH-1…
Browse files Browse the repository at this point in the history
…3239)

* bpo-32587: Make winreg.REG_MULTI_SZ support PendingFileRenameOperations

* Address review comments.
(cherry picked from commit e223ba1)

Co-authored-by: Zackery Spytz <zspytz@gmail.com>
  • Loading branch information
miss-islington and ZackerySpytz authored Sep 9, 2019
1 parent 14f7de7 commit ebca7eb
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 16 deletions.
1 change: 1 addition & 0 deletions Lib/test/test_winreg.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
("String Val", "A string value", REG_SZ),
("StringExpand", "The path is %path%", REG_EXPAND_SZ),
("Multi-string", ["Lots", "of", "string", "values"], REG_MULTI_SZ),
("Multi-nul", ["", "", "", ""], REG_MULTI_SZ),
("Raw Data", b"binary\x00data", REG_BINARY),
("Big String", "x"*(2**14-1), REG_SZ),
("Big Binary", b"x"*(2**14), REG_BINARY),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Make :data:`winreg.REG_MULTI_SZ` support zero-length strings.
41 changes: 25 additions & 16 deletions PC/winreg.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,24 +518,39 @@ 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++) {
;
}
}
}

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;
}

Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit ebca7eb

Please sign in to comment.