mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
bpo-32890, os: Use errno instead of GetLastError() in execve() and truncate() (GH-5784)
path_error() uses GetLastError() on Windows, but some os functions are implemented via CRT APIs which report errors via errno. This may result in raising OSError with invalid error code (such as zero). Introduce posix_path_error() function and use it where appropriate.
This commit is contained in:
parent
a2670565d8
commit
834603112e
3 changed files with 27 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue