annotate Modules/python.c @ 75944:c0900fd6e4b3 3.2

Issue #3367: NULL-terminate argv[] copies to prevent an invalid access in sys_update_path().
author Stefan Krah <skrah@bytereef.org>
date Mon, 26 Mar 2012 15:05:22 +0200
parents 3b17210f34d9
children c838c9b117f1 f77998006917
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5853
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Minimal main program -- everything is loaded from the library */
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
8894
764de731c806 Now include Python.h
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3 #include "Python.h"
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
4 #include <locale.h>
8894
764de731c806 Now include Python.h
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
5
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
6 #ifdef __FreeBSD__
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
7 #include <floatingpoint.h>
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
8 #endif
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
9
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
10 #ifdef MS_WINDOWS
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
11 int
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
12 wmain(int argc, wchar_t **argv)
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
13 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
14 return Py_Main(argc, argv);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
15 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
16 #else
53767
ac209f132b17 Issue #5915: Implement PEP 383, Non-decodable Bytes in
Martin v. Löwis <martin@v.loewis.de>
parents: 51902
diff changeset
17
65568
45079ad1e260 Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65412
diff changeset
18 #ifdef __APPLE__
45079ad1e260 Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65412
diff changeset
19 extern wchar_t* _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size);
53767
ac209f132b17 Issue #5915: Implement PEP 383, Non-decodable Bytes in
Martin v. Löwis <martin@v.loewis.de>
parents: 51902
diff changeset
20 #endif
ac209f132b17 Issue #5915: Implement PEP 383, Non-decodable Bytes in
Martin v. Löwis <martin@v.loewis.de>
parents: 51902
diff changeset
21
6055
72d004971b26 Keep gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5853
diff changeset
22 int
13481
3abecb34737f - ANSI-fication
Fredrik Lundh <fredrik@pythonware.com>
parents: 9601
diff changeset
23 main(int argc, char **argv)
5853
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 {
75944
c0900fd6e4b3 Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents: 74000
diff changeset
25 wchar_t **argv_copy = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
26 /* We need a second copies, as Python might modify the first one. */
75944
c0900fd6e4b3 Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents: 74000
diff changeset
27 wchar_t **argv_copy2 = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
28 int i, res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
29 char *oldloc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
30 /* 754 requires that FP exceptions run in "no stop" mode by default,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
31 * and until C vendors implement C99's ways to control FP exceptions,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
32 * Python requires non-stop mode. Alas, some platforms enable FP
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
33 * exceptions by default. Here we disable them.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
34 */
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
35 #ifdef __FreeBSD__
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
36 fp_except_t m;
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
37
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
38 m = fpgetmask();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
39 fpsetmask(m & ~FP_X_OFL);
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
40 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
41 if (!argv_copy || !argv_copy2) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
42 fprintf(stderr, "out of memory\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
43 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
44 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
45 oldloc = strdup(setlocale(LC_ALL, NULL));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
46 setlocale(LC_ALL, "");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
47 for (i = 0; i < argc; i++) {
65568
45079ad1e260 Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65412
diff changeset
48 #ifdef __APPLE__
45079ad1e260 Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65412
diff changeset
49 argv_copy[i] = _Py_DecodeUTF8_surrogateescape(argv[i], strlen(argv[i]));
45079ad1e260 Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65412
diff changeset
50 #else
65412
3794c9b50824 Add an optional size argument to _Py_char2wchar()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65277
diff changeset
51 argv_copy[i] = _Py_char2wchar(argv[i], NULL);
65568
45079ad1e260 Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65412
diff changeset
52 #endif
74000
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
53 if (!argv_copy[i]) {
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
54 fprintf(stderr, "Fatal Python error: "
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
55 "unable to decode the command line argument #%i\n",
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
56 i + 1);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
57 return 1;
74000
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
58 }
65277
49df778889e6 Revert r85435 (and r85440): decode command line arguments from utf-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65275
diff changeset
59 argv_copy2[i] = argv_copy[i];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
60 }
75944
c0900fd6e4b3 Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents: 74000
diff changeset
61 argv_copy2[argc] = argv_copy[argc] = NULL;
c0900fd6e4b3 Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents: 74000
diff changeset
62
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
63 setlocale(LC_ALL, oldloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
64 free(oldloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
65 res = Py_Main(argc, argv_copy);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
66 for (i = 0; i < argc; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
67 PyMem_Free(argv_copy2[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
68 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
69 PyMem_Free(argv_copy);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
70 PyMem_Free(argv_copy2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
71 return res;
5853
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
73 #endif