diff --git a/Misc/NEWS.d/next/C_API/2026-10-19-20-38-17.gh-issue-159739.eb9cdc.rst b/Misc/NEWS.d/next/C_API/2026-10-19-20-38-17.gh-issue-159739.eb9cdc.rst new file mode 100644 index 00000000000000..e3ca598d37fdce --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2026-10-19-20-38-17.gh-issue-159739.eb9cdc.rst @@ -0,0 +1,2 @@ +:c:func:`PyInitConfig_SetStr` now releases a previously configured value and +preserves it if conversion of the replacement fails. diff --git a/Python/initconfig.c b/Python/initconfig.c index c95df5b6ef2158..e21cbaaca5b89b 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -4357,14 +4357,17 @@ PyInitConfig_SetStr(PyInitConfig *config, const char *name, const char* value) 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; - *member = utf8_to_wstr(config, value); - if (*member == NULL) { + wchar_t *wstr = utf8_to_wstr(config, value); + if (wstr == NULL) { return -1; } + free(*member); + *member = wstr; return 0; }