Skip to content

bpo-36763: _PyInitError always use int for exitcode #13360

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions Include/cpython/coreconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,7 @@ typedef struct {
} _type;
const char *_func;
const char *err_msg;
#ifdef MS_WINDOWS
unsigned int exitcode;
#else
int exitcode;
#endif
} _PyInitError;

/* Almost all errors causing Python initialization to fail */
Expand Down
48 changes: 22 additions & 26 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,25 +130,21 @@ pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0)
if (sysdict != NULL) {
sys_path = _PyDict_GetItemIdWithError(sysdict, &PyId_path);
if (sys_path == NULL && PyErr_Occurred()) {
goto error;
return -1;
}
}
else {
sys_path = NULL;
}
if (sys_path == NULL) {
PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
goto error;
return -1;
}

if (PyList_Insert(sys_path, 0, path0)) {
goto error;
return -1;
}
return 0;

error:
PyErr_Print();
return -1;
}


Expand Down Expand Up @@ -443,11 +439,9 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode)
}


static _PyInitError
static void
pymain_run_python(int *exitcode)
{
_PyInitError err;

PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
/* pymain_run_stdin() modify the config */
_PyCoreConfig *config = &interp->core_config;
Expand All @@ -464,22 +458,20 @@ pymain_run_python(int *exitcode)

if (main_importer_path != NULL) {
if (pymain_sys_path_add_path0(interp, main_importer_path) < 0) {
err = _Py_INIT_EXIT(1);
goto done;
goto error;
}
}
else if (!config->isolated) {
PyObject *path0 = NULL;
if (_PyPathConfig_ComputeSysPath0(&config->argv, &path0)) {
if (path0 == NULL) {
err = _Py_INIT_NO_MEMORY();
goto done;
}
int res = _PyPathConfig_ComputeSysPath0(&config->argv, &path0);
if (res < 0) {
goto error;
}

if (res > 0) {
if (pymain_sys_path_add_path0(interp, path0) < 0) {
Py_DECREF(path0);
err = _Py_INIT_EXIT(1);
goto done;
goto error;
}
Py_DECREF(path0);
}
Expand Down Expand Up @@ -508,11 +500,14 @@ pymain_run_python(int *exitcode)
}

pymain_repl(config, &cf, exitcode);
err = _Py_INIT_OK();
goto done;

error:
PyErr_Print();
*exitcode = 1;

done:
Py_XDECREF(main_importer_path);
return err;
}


Expand Down Expand Up @@ -578,17 +573,14 @@ _Py_RunMain(void)
{
int exitcode = 0;

_PyInitError err = pymain_run_python(&exitcode);
if (_Py_INIT_FAILED(err)) {
pymain_exit_error(err);
}

pymain_run_python(&exitcode);
if (Py_FinalizeEx() < 0) {
/* Value unlikely to be confused with a non-error exit status or
other special meaning */
exitcode = 120;
}

done:
pymain_free();

if (_Py_UnhandledKeyboardInterrupt) {
Expand All @@ -603,6 +595,10 @@ static int
pymain_main(_PyArgv *args)
{
_PyInitError err = pymain_init(args);
if (_Py_INIT_IS_EXIT(err)) {
pymain_free();
return err.exitcode;
}
if (_Py_INIT_FAILED(err)) {
pymain_exit_error(err);
}
Expand Down
18 changes: 11 additions & 7 deletions Python/pathconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -570,18 +570,17 @@ Py_GetProgramName(void)
directory ("-m module" case) which will be prepended to sys.argv:
sys.path[0].

Return 1 if the path is correctly resolved, but *path0_p can be NULL
if the Unicode object fail to be created.
Return 1 if the path is correctly resolved and written into *path0_p.

Return 0 if it fails to resolve the full path (and *path0_p will be NULL).
For example, return 0 if the current working directory has been removed
(bpo-36236) or if argv is empty.
Return 0 if it fails to resolve the full path. For example, return 0 if the
current working directory has been removed (bpo-36236) or if argv is empty.

Raise an exception and return -1 on error.
*/
int
_PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p)
{
assert(_PyWstrList_CheckConsistency(argv));
assert(*path0_p == NULL);

if (argv->length == 0) {
/* Leave sys.path unchanged if sys.argv is empty */
Expand Down Expand Up @@ -697,7 +696,12 @@ _PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p)
}
#endif /* All others */

*path0_p = PyUnicode_FromWideChar(path0, n);
PyObject *path0_obj = PyUnicode_FromWideChar(path0, n);
if (path0_obj == NULL) {
return -1;
}

*path0_p = path0_obj;
return 1;
}

Expand Down
11 changes: 4 additions & 7 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -2124,18 +2124,15 @@ Py_FatalError(const char *msg)
void _Py_NO_RETURN
_Py_ExitInitError(_PyInitError err)
{
assert(_Py_INIT_FAILED(err));
if (_Py_INIT_IS_EXIT(err)) {
#ifdef MS_WINDOWS
ExitProcess(err.exitcode);
#else
exit(err.exitcode);
#endif
}
else {
assert(_Py_INIT_IS_ERROR(err));
else if (_Py_INIT_IS_ERROR(err)) {
fatal_error(err._func, err.err_msg, 1);
}
else {
Py_FatalError("_Py_ExitInitError() must not be called on success");
}
}

/* Clean up and exit */
Expand Down