Skip to content

Commit c588fee

Browse files
committed
Issue #15893: Improve error handling in main() and Py_FrozenMain()
* handle _PyMem_RawStrdup() failure * Py_FrozenMain() releases memory on error * Py_FrozenMain() duplicates the old locale, as done in main()
1 parent 739cf4e commit c588fee

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

Modules/python.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ main(int argc, char **argv)
4545
#endif
4646

4747
oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
48+
if (!oldloc) {
49+
fprintf(stderr, "out of memory\n");
50+
return 1;
51+
}
52+
4853
setlocale(LC_ALL, "");
4954
for (i = 0; i < argc; i++) {
5055
argv_copy[i] = _Py_char2wchar(argv[i], NULL);

Python/frozenmain.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ int
1616
Py_FrozenMain(int argc, char **argv)
1717
{
1818
char *p;
19-
int i, n, sts;
19+
int i, n, sts = 1;
2020
int inspect = 0;
2121
int unbuffered = 0;
22-
char *oldloc;
23-
wchar_t **argv_copy;
22+
char *oldloc = NULL;
23+
wchar_t **argv_copy = NULL;
2424
/* We need a second copies, as Python might modify the first one. */
25-
wchar_t **argv_copy2;
25+
wchar_t **argv_copy2 = NULL;
2626

27-
argv_copy = PyMem_RawMalloc(sizeof(wchar_t*)*argc);
28-
argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*)*argc);
27+
argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
28+
argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
2929
if (!argv_copy || !argv_copy2) {
3030
fprintf(stderr, "out of memory\n");
31-
return 1;
31+
goto error;
3232
}
3333

3434
Py_FrozenFlag = 1; /* Suppress errors from getpath.c */
@@ -44,23 +44,26 @@ Py_FrozenMain(int argc, char **argv)
4444
setbuf(stderr, (char *)NULL);
4545
}
4646

47-
if (!argv_copy) {
47+
oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
48+
if (!oldloc) {
4849
fprintf(stderr, "out of memory\n");
49-
return 1;
50+
goto error;
5051
}
5152

52-
oldloc = setlocale(LC_ALL, NULL);
5353
setlocale(LC_ALL, "");
5454
for (i = 0; i < argc; i++) {
5555
argv_copy[i] = _Py_char2wchar(argv[i], NULL);
56+
argv_copy2[i] = argv_copy[i];
5657
if (!argv_copy[i]) {
5758
fprintf(stderr, "Unable to decode the command line argument #%i\n",
5859
i + 1);
59-
return 1;
60+
argc = i;
61+
goto error;
6062
}
61-
argv_copy2[i] = argv_copy[i];
6263
}
6364
setlocale(LC_ALL, oldloc);
65+
PyMem_RawFree(oldloc);
66+
oldloc = NULL;
6467

6568
#ifdef MS_WINDOWS
6669
PyInitFrozenExtensions();
@@ -94,10 +97,14 @@ Py_FrozenMain(int argc, char **argv)
9497
PyWinFreeze_ExeTerm();
9598
#endif
9699
Py_Finalize();
97-
for (i = 0; i < argc; i++) {
98-
PyMem_RawFree(argv_copy2[i]);
99-
}
100+
101+
error:
100102
PyMem_RawFree(argv_copy);
101-
PyMem_RawFree(argv_copy2);
103+
if (argv_copy2) {
104+
for (i = 0; i < argc; i++)
105+
PyMem_RawFree(argv_copy2[i]);
106+
PyMem_RawFree(argv_copy2);
107+
}
108+
PyMem_RawFree(oldloc);
102109
return sts;
103110
}

0 commit comments

Comments
 (0)