GeezerVison is showing github.com — Null dereferencing of a pointer in initconfig.c · Issue #160962 · python/cpython
Null dereferencing of a pointer in initconfig.c #160962Labels interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)topic-C-APItype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error DescriptionBug report
Potentially, if "value" equals NULL and "spec->type" equals "PyConfig_MEMBER_WSTR_OPT", null will be passed into "utf8_to_wstr" function and might cause a segmentation fault in strlen
|
if (value == NULL && spec->type != PyConfig_MEMBER_WSTR_OPT) { |
|
initconfig_set_error(config, "config option string cannot be NULL"); |
|
return -1; |
|
} |
|
|
|
wchar_t **member = raw_member; |
|
|
|
wchar_t *wstr = utf8_to_wstr(config, value); |
|
utf8_to_wstr(PyInitConfig *config, const char *str) |
|
{ |
|
wchar_t *wstr; |
|
size_t wlen; |
|
int res = _Py_DecodeUTF8(str, strlen(str), &wstr, &wlen, _Py_ERROR_STRICT); |
Documentation states that "value" is a null-terminated UTF-8 string, but isn't clearly stating that Null is allowed
Suggested fix: separate "value" and "spec->type" checks
if (value == NULL) {
if (spec->type != PyConfig_MEMBER_WSTR_OPT) {
nitconfig_set_error(config, "config option string cannot be NULL");
return -1;
}
wchar_t **member = raw_member;
free(*member);
*member = wstr;
return 0;
}
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs
Activitychanged the title [-]Null derefication of a pointer in initconfig.c[/-] [+]Null dereferencing of a pointer in initconfig.c[/+] on Oct 30, 2026lazerg commented on Oct 30, 2026 I will work on it if maintainers approve picnixz commented on Oct 30, 2026 How can a NUL-terminated UTF8 string be NULL? are other functions checking for nullity? i believe this is unnecessary churn. Aruise commented on Oct 30, 2026 @picnixz
It does describe "value" as a null-terminated UTF-8 string, yes, which indeed does not explicitly allow NULL
However, the implementation explicitly checks whether "value" is NULL, suggesting that NULL might have been intended to be supported at some point NekoAsakura commented on Oct 30, 2026 Reproduced on main:
#include <Python.h>
int main(void)
{
PyInitConfig *config = PyInitConfig_Create();
return PyInitConfig_SetStr(config, "prefix", NULL);
}
#0 __strlen_avx2 ()
#1 utf8_to_wstr (config=..., str=0x0) at Python/initconfig.c:4328
#2 PyInitConfig_SetStr (config=..., name=..., value=0x0) at Python/initconfig.c:4376
#3 main ()
Original implementation (#123502) added the NULL check with an explicit exemption for PyConfig_MEMBER_WSTR_OPT, but had no return -1:
|
if (value == NULL && spec->type != PyConfig_MEMBER_WSTR_OPT) { |
|
initconfig_set_error(config, "config option string cannot be NULL"); |
|
} |
|
|
|
wchar_t **member = raw_member; |
|
|
|
*member = utf8_to_wstr(config, value); |
It was partially fixed in #159769 (comment), but left the WSTR_OPT exemption as-is.
cc @vstinner sobolevn commented on Nov 3, 2026 NekoAsakura commented on Nov 3, 2026
10. This was fixed in 395d766
That only fixed the non-WSTR_OPT path. vstinner commented on Nov 3, 2026 Hi. I wrote #161258 to fix PyInitConfig_SetStr() crash when the value is NULL. The PR also adds multiple tests on all Get functions. vstinner commented on Nov 4, 2026 Thanks for the bug report, I merged my fix.
MetadataMetadatainterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)topic-C-APItype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error DevelopmentNo branches or pull requestsIssue actions
|