Revert r33661, which broke all buildbots.
diff --git a/Modules/main.c b/Modules/main.c
index 2148ccc..5a84cc2 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -287,7 +287,7 @@
{
int c;
int sts;
- wchar_t *command = NULL;
+ char *command = NULL;
wchar_t *filename = NULL;
wchar_t *module = NULL;
FILE *fp = stdin;
@@ -299,6 +299,7 @@
int version = 0;
int saw_unbuffered_flag = 0;
PyCompilerFlags cf;
+ char *oldloc;
cf.cf_flags = 0;
@@ -309,19 +310,30 @@
while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
if (c == 'c') {
- size_t len;
+ size_t r1, r2;
+ oldloc = setlocale(LC_ALL, NULL);
+ setlocale(LC_ALL, "");
+ r1 = wcslen(_PyOS_optarg);
+ r2 = wcstombs(NULL, _PyOS_optarg, r1);
+ if (r2 == (size_t) -1)
+ Py_FatalError(
+ "cannot convert character encoding of -c argument");
+ if (r2 > r1)
+ r1 = r2;
+ r1 += 2;
/* -c is the last option; following arguments
that look like options are left for the
command to interpret. */
-
- len = wcslen(_PyOS_optarg) + 1 + 1;
- command = (wchar_t *)malloc(sizeof(wchar_t) * len);
+ command = (char *)malloc(r1);
if (command == NULL)
Py_FatalError(
"not enough memory to copy -c argument");
- wcscpy(command, _PyOS_optarg);
- command[len - 2] = '\n';
- command[len - 1] = 0;
+ r2 = wcstombs(command, _PyOS_optarg, r1);
+ if (r2 > r1-1)
+ Py_FatalError(
+ "not enough memory to copy -c argument");
+ strcat(command, "\n");
+ setlocale(LC_ALL, oldloc);
break;
}
@@ -531,18 +543,8 @@
}
if (command) {
- PyObject *commandObj = PyUnicode_FromUnicode(
- command, wcslen(command));
+ sts = PyRun_SimpleStringFlags(command, &cf) != 0;
free(command);
- if (commandObj != NULL) {
- sts = PyRun_SimpleStringFlags(
- _PyUnicode_AsString(commandObj), &cf) != 0;
- }
- else {
- PyErr_Print();
- sts = 1;
- }
- Py_DECREF(commandObj);
} else if (module) {
sts = RunModule(module, 1);
}