diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 6dbc2556123..3f6e48f0c8e 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1589,6 +1589,16 @@ class ExecTests(unittest.TestCase): with self.assertRaises(ValueError): os.execve(args[0], args, newenv) + @unittest.skipUnless(sys.platform == "win32", "Win32-specific test") + def test_execve_with_empty_path(self): + # bpo-32890: Check GetLastError() misuse + try: + os.execve('', ['arg'], {}) + except OSError as e: + self.assertTrue(e.winerror is None or e.winerror != 0) + else: + self.fail('No OSError raised') + @unittest.skipUnless(sys.platform == "win32", "Win32 specific tests") class Win32ErrorTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst b/Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst new file mode 100644 index 00000000000..e8a63b33419 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst @@ -0,0 +1,2 @@ +Fix usage of GetLastError() instead of errno in os.execve() and +os.truncate(). diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 23552bea4ca..9ccdc8eff1b 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1455,6 +1455,12 @@ win32_error_object(const char* function, PyObject* filename) #endif /* MS_WINDOWS */ +static PyObject * +posix_path_object_error(PyObject *path) +{ + return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path); +} + static PyObject * path_object_error(PyObject *path) { @@ -1462,7 +1468,7 @@ path_object_error(PyObject *path) return PyErr_SetExcFromWindowsErrWithFilenameObject( PyExc_OSError, 0, path); #else - return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path); + return posix_path_object_error(path); #endif } @@ -1483,6 +1489,12 @@ path_error(path_t *path) return path_object_error(path->object); } +static PyObject * +posix_path_error(path_t *path) +{ + return posix_path_object_error(path->object); +} + static PyObject * path_error2(path_t *path, path_t *path2) { @@ -5141,7 +5153,7 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) /* If we get here it's definitely an error */ - path_error(path); + posix_path_error(path); free_string_array(envlist, envc); fail: @@ -9477,7 +9489,7 @@ os_truncate_impl(PyObject *module, path_t *path, Py_off_t length) _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS if (result < 0) - return path_error(path); + return posix_path_error(path); Py_RETURN_NONE; }