bpo-37926: Fix PySys_SetArgvEx(0, NULL, 0) crash (GH-15415)

empty_argv is no longer static in Python 3.8, but it is declared in
a temporary scope, whereas argv keeps a reference to it.
empty_argv memory (allocated on the stack) is reused by
make_sys_argv() code which is inlined when using gcc -O3.

Define empty_argv in PySys_SetArgvEx() body, to ensure
that it remains valid for the whole lifetime of
the PySys_SetArgvEx() call.
This commit is contained in:
Victor Stinner 2019-08-23 11:04:16 +01:00 committed by GitHub
parent d288b29fc6
commit c48682509d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 2 additions and 1 deletions

View File

@ -0,0 +1 @@
Fix a crash in ``PySys_SetArgvEx(0, NULL, 0)``.

View File

@ -3058,11 +3058,11 @@ make_sys_argv(int argc, wchar_t * const * argv)
void void
PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
{ {
wchar_t* empty_argv[1] = {L""};
PyThreadState *tstate = _PyThreadState_GET(); PyThreadState *tstate = _PyThreadState_GET();
if (argc < 1 || argv == NULL) { if (argc < 1 || argv == NULL) {
/* Ensure at least one (empty) argument is seen */ /* Ensure at least one (empty) argument is seen */
wchar_t* empty_argv[1] = {L""};
argv = empty_argv; argv = empty_argv;
argc = 1; argc = 1;
} }