mirror of
https://github.com/python/cpython
synced 2024-09-05 08:17:45 +00:00
bpo-32587: Make winreg.REG_MULTI_SZ support zero-length strings (#13239)
* bpo-32587: Make winreg.REG_MULTI_SZ support PendingFileRenameOperations * Address review comments.
This commit is contained in:
parent
a6563650c8
commit
e223ba13d8
|
@ -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),
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Make :data:`winreg.REG_MULTI_SZ` support zero-length strings.
|
41
PC/winreg.c
41
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;
|
||||
|
||||
for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
|
||||
for (; P < Q && *P != '\0'; P++)
|
||||
if (len > 0 && data[len - 1] == '\0') {
|
||||
Q = data + len - 1;
|
||||
}
|
||||
else {
|
||||
Q = data + len;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue