mirror of https://github.com/python/cpython.git
[3.11] gh-107913: Fix possible losses of OSError error codes (GH-107930) (GH-108524)
Functions like PyErr_SetFromErrno() and SetFromWindowsErr() should be
called immediately after using the C API which sets errno or the Windows
error code.
(cherry picked from commit 2b15536fa9
)
This commit is contained in:
parent
8a275f7c01
commit
b9fc536399
|
@ -0,0 +1,3 @@
|
|||
Fix possible losses of ``errno`` and ``winerror`` values in :exc:`OSError`
|
||||
exceptions if they were cleared or modified by the cleanup code before
|
||||
creating the exception object.
|
|
@ -3075,8 +3075,8 @@ _curses_getwin(PyObject *module, PyObject *file)
|
|||
}
|
||||
datalen = PyBytes_GET_SIZE(data);
|
||||
if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
|
||||
Py_DECREF(data);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
Py_DECREF(data);
|
||||
goto error;
|
||||
}
|
||||
Py_DECREF(data);
|
||||
|
|
|
@ -389,6 +389,11 @@ _Py_COMP_DIAG_POP
|
|||
|
||||
if (async_err)
|
||||
goto error;
|
||||
|
||||
if (self->fd < 0) {
|
||||
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
else {
|
||||
PyObject *fdobj;
|
||||
|
@ -420,12 +425,7 @@ _Py_COMP_DIAG_POP
|
|||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
fd_is_own = 1;
|
||||
if (self->fd < 0) {
|
||||
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);
|
||||
goto error;
|
||||
}
|
||||
|
||||
#ifndef MS_WINDOWS
|
||||
if (_Py_set_inheritable(self->fd, 0, atomic_flag_works) < 0)
|
||||
|
@ -1044,8 +1044,8 @@ _io_FileIO_truncate_impl(fileio *self, PyObject *posobj)
|
|||
Py_END_ALLOW_THREADS
|
||||
|
||||
if (ret != 0) {
|
||||
Py_DECREF(posobj);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
Py_DECREF(posobj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -368,8 +368,8 @@ _io__WindowsConsoleIO___init___impl(winconsoleio *self, PyObject *nameobj,
|
|||
else
|
||||
self->fd = _Py_open_osfhandle_noraise(handle, _O_RDONLY | _O_BINARY);
|
||||
if (self->fd < 0) {
|
||||
CloseHandle(handle);
|
||||
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);
|
||||
CloseHandle(handle);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -735,8 +735,8 @@ _locale_bindtextdomain_impl(PyObject *module, const char *domain,
|
|||
}
|
||||
current_dirname = bindtextdomain(domain, dirname);
|
||||
if (current_dirname == NULL) {
|
||||
Py_XDECREF(dirname_bytes);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
Py_XDECREF(dirname_bytes);
|
||||
return NULL;
|
||||
}
|
||||
result = PyUnicode_DecodeLocale(current_dirname, NULL);
|
||||
|
|
|
@ -516,12 +516,12 @@ _multiprocessing_SemLock_impl(PyTypeObject *type, int kind, int value,
|
|||
return result;
|
||||
|
||||
failure:
|
||||
if (handle != SEM_FAILED)
|
||||
SEM_CLOSE(handle);
|
||||
PyMem_Free(name_copy);
|
||||
if (!PyErr_Occurred()) {
|
||||
_PyMp_SetError(NULL, MP_STANDARD_ERROR);
|
||||
}
|
||||
if (handle != SEM_FAILED)
|
||||
SEM_CLOSE(handle);
|
||||
PyMem_Free(name_copy);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -556,8 +556,9 @@ _multiprocessing_SemLock__rebuild_impl(PyTypeObject *type, SEM_HANDLE handle,
|
|||
if (name != NULL) {
|
||||
handle = sem_open(name, 0);
|
||||
if (handle == SEM_FAILED) {
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
PyMem_Free(name_copy);
|
||||
return PyErr_SetFromErrno(PyExc_OSError);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -3898,8 +3898,8 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
|
|||
/* the password callback has already set the error information */
|
||||
}
|
||||
else if (errno != 0) {
|
||||
ERR_clear_error();
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
ERR_clear_error();
|
||||
}
|
||||
else {
|
||||
_setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__);
|
||||
|
@ -3919,8 +3919,8 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
|
|||
/* the password callback has already set the error information */
|
||||
}
|
||||
else if (errno != 0) {
|
||||
ERR_clear_error();
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
ERR_clear_error();
|
||||
}
|
||||
else {
|
||||
_setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__);
|
||||
|
@ -4147,8 +4147,8 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self,
|
|||
PySSL_END_ALLOW_THREADS
|
||||
if (r != 1) {
|
||||
if (errno != 0) {
|
||||
ERR_clear_error();
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
ERR_clear_error();
|
||||
}
|
||||
else {
|
||||
_setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__);
|
||||
|
@ -4195,8 +4195,8 @@ _ssl__SSLContext_load_dh_params(PySSLContext *self, PyObject *filepath)
|
|||
PySSL_END_ALLOW_THREADS
|
||||
if (dh == NULL) {
|
||||
if (errno != 0) {
|
||||
ERR_clear_error();
|
||||
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath);
|
||||
ERR_clear_error();
|
||||
}
|
||||
else {
|
||||
_setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__);
|
||||
|
|
|
@ -469,11 +469,10 @@ faulthandler_allocate_stack(void)
|
|||
|
||||
int err = sigaltstack(&stack, &old_stack);
|
||||
if (err) {
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
/* Release the stack to retry sigaltstack() next time */
|
||||
PyMem_Free(stack.ss_sp);
|
||||
stack.ss_sp = NULL;
|
||||
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -208,11 +208,12 @@ fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
|
|||
if (mutate_arg && (len <= IOCTL_BUFSZ)) {
|
||||
memcpy(str, buf, len);
|
||||
}
|
||||
PyBuffer_Release(&pstr); /* No further access to str below this point */
|
||||
if (ret < 0) {
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
PyBuffer_Release(&pstr);
|
||||
return NULL;
|
||||
}
|
||||
PyBuffer_Release(&pstr);
|
||||
if (mutate_arg) {
|
||||
return PyLong_FromLong(ret);
|
||||
}
|
||||
|
@ -237,8 +238,8 @@ fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
|
|||
ret = ioctl(fd, code, buf);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (ret < 0) {
|
||||
PyBuffer_Release(&pstr);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
PyBuffer_Release(&pstr);
|
||||
return NULL;
|
||||
}
|
||||
PyBuffer_Release(&pstr);
|
||||
|
|
|
@ -347,11 +347,12 @@ getpath_readlines(PyObject *Py_UNUSED(self), PyObject *args)
|
|||
return NULL;
|
||||
}
|
||||
FILE *fp = _Py_wfopen(path, L"rb");
|
||||
PyMem_Free((void *)path);
|
||||
if (!fp) {
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
PyMem_Free((void *)path);
|
||||
return NULL;
|
||||
}
|
||||
PyMem_Free((void *)path);
|
||||
|
||||
r = PyList_New(0);
|
||||
if (!r) {
|
||||
|
|
|
@ -1366,6 +1366,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
|
|||
prot, flags,
|
||||
fd, offset);
|
||||
|
||||
int saved_errno = errno;
|
||||
if (devzero != -1) {
|
||||
close(devzero);
|
||||
}
|
||||
|
@ -1373,6 +1374,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
|
|||
if (m_obj->data == (char *)-1) {
|
||||
m_obj->data = NULL;
|
||||
Py_DECREF(m_obj);
|
||||
errno = saved_errno;
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -365,8 +365,9 @@ _overlapped_RegisterWaitWithQueue_impl(PyObject *module, HANDLE Object,
|
|||
&NewWaitObject, Object, PostToQueueCallback, pdata, Milliseconds,
|
||||
WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE))
|
||||
{
|
||||
SetFromWindowsErr(0);
|
||||
PyMem_RawFree(pdata);
|
||||
return SetFromWindowsErr(0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return Py_BuildValue(F_HANDLE, NewWaitObject);
|
||||
|
|
|
@ -3810,9 +3810,10 @@ posix_getcwd(int use_bytes)
|
|||
return NULL;
|
||||
}
|
||||
if (!len) {
|
||||
PyErr_SetFromWindowsErr(0);
|
||||
if (wbuf2 != wbuf)
|
||||
PyMem_RawFree(wbuf2);
|
||||
return PyErr_SetFromWindowsErr(0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *resobj = PyUnicode_FromWideChar(wbuf2, len);
|
||||
|
@ -3860,8 +3861,9 @@ posix_getcwd(int use_bytes)
|
|||
return PyErr_NoMemory();
|
||||
}
|
||||
if (cwd == NULL) {
|
||||
posix_error();
|
||||
PyMem_RawFree(buf);
|
||||
return posix_error();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *obj;
|
||||
|
@ -4073,8 +4075,8 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
|
|||
int error = GetLastError();
|
||||
if (error == ERROR_FILE_NOT_FOUND)
|
||||
goto exit;
|
||||
Py_DECREF(list);
|
||||
list = path_error(path);
|
||||
path_error(path);
|
||||
Py_CLEAR(list);
|
||||
goto exit;
|
||||
}
|
||||
do {
|
||||
|
@ -4087,14 +4089,12 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
|
|||
Py_SETREF(v, PyUnicode_EncodeFSDefault(v));
|
||||
}
|
||||
if (v == NULL) {
|
||||
Py_DECREF(list);
|
||||
list = NULL;
|
||||
Py_CLEAR(list);
|
||||
break;
|
||||
}
|
||||
if (PyList_Append(list, v) != 0) {
|
||||
Py_DECREF(v);
|
||||
Py_DECREF(list);
|
||||
list = NULL;
|
||||
Py_CLEAR(list);
|
||||
break;
|
||||
}
|
||||
Py_DECREF(v);
|
||||
|
@ -4105,8 +4105,8 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
|
|||
/* FindNextFile sets error to ERROR_NO_MORE_FILES if
|
||||
it got to the end of the directory. */
|
||||
if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
|
||||
Py_DECREF(list);
|
||||
list = path_error(path);
|
||||
path_error(path);
|
||||
Py_CLEAR(list);
|
||||
goto exit;
|
||||
}
|
||||
} while (result == TRUE);
|
||||
|
@ -4115,8 +4115,8 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
|
|||
if (hFindFile != INVALID_HANDLE_VALUE) {
|
||||
if (FindClose(hFindFile) == FALSE) {
|
||||
if (list != NULL) {
|
||||
Py_DECREF(list);
|
||||
list = path_error(path);
|
||||
path_error(path);
|
||||
Py_CLEAR(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4178,7 +4178,8 @@ _posix_listdir(path_t *path, PyObject *list)
|
|||
}
|
||||
|
||||
if (dirp == NULL) {
|
||||
list = path_error(path);
|
||||
path_error(path);
|
||||
list = NULL;
|
||||
#ifdef HAVE_FDOPENDIR
|
||||
if (fd != -1) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
|
@ -4200,8 +4201,8 @@ _posix_listdir(path_t *path, PyObject *list)
|
|||
if (errno == 0) {
|
||||
break;
|
||||
} else {
|
||||
Py_DECREF(list);
|
||||
list = path_error(path);
|
||||
path_error(path);
|
||||
Py_CLEAR(list);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
@ -5879,8 +5880,9 @@ os_execv_impl(PyObject *module, path_t *path, PyObject *argv)
|
|||
|
||||
/* If we get here it's definitely an error */
|
||||
|
||||
posix_error();
|
||||
free_string_array(argvlist, argc);
|
||||
return posix_error();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -6177,11 +6179,12 @@ parse_file_actions(PyObject *file_actions,
|
|||
}
|
||||
errno = posix_spawn_file_actions_addopen(file_actionsp,
|
||||
fd, PyBytes_AS_STRING(path), oflag, (mode_t)mode);
|
||||
Py_DECREF(path);
|
||||
if (errno) {
|
||||
posix_error();
|
||||
Py_DECREF(path);
|
||||
goto fail;
|
||||
}
|
||||
Py_DECREF(path);
|
||||
break;
|
||||
}
|
||||
case POSIX_SPAWN_CLOSE: {
|
||||
|
@ -6578,12 +6581,15 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv)
|
|||
_Py_END_SUPPRESS_IPH
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
int saved_errno = errno;
|
||||
free_string_array(argvlist, argc);
|
||||
|
||||
if (spawnval == -1)
|
||||
return posix_error();
|
||||
else
|
||||
return Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
|
||||
if (spawnval == -1) {
|
||||
errno = saved_errno;
|
||||
posix_error();
|
||||
return NULL;
|
||||
}
|
||||
return Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
|
@ -6797,6 +6803,7 @@ os_fork1_impl(PyObject *module)
|
|||
}
|
||||
PyOS_BeforeFork();
|
||||
pid = fork1();
|
||||
int saved_errno = errno;
|
||||
if (pid == 0) {
|
||||
/* child: this clobbers and resets the import lock. */
|
||||
PyOS_AfterFork_Child();
|
||||
|
@ -6804,8 +6811,10 @@ os_fork1_impl(PyObject *module)
|
|||
/* parent: release the import lock. */
|
||||
PyOS_AfterFork_Parent();
|
||||
}
|
||||
if (pid == -1)
|
||||
if (pid == -1) {
|
||||
errno = saved_errno;
|
||||
return posix_error();
|
||||
}
|
||||
return PyLong_FromPid(pid);
|
||||
}
|
||||
#endif /* HAVE_FORK1 */
|
||||
|
@ -6836,6 +6845,7 @@ os_fork_impl(PyObject *module)
|
|||
}
|
||||
PyOS_BeforeFork();
|
||||
pid = fork();
|
||||
int saved_errno = errno;
|
||||
if (pid == 0) {
|
||||
/* child: this clobbers and resets the import lock. */
|
||||
PyOS_AfterFork_Child();
|
||||
|
@ -6843,8 +6853,10 @@ os_fork_impl(PyObject *module)
|
|||
/* parent: release the import lock. */
|
||||
PyOS_AfterFork_Parent();
|
||||
}
|
||||
if (pid == -1)
|
||||
if (pid == -1) {
|
||||
errno = saved_errno;
|
||||
return posix_error();
|
||||
}
|
||||
return PyLong_FromPid(pid);
|
||||
}
|
||||
#endif /* HAVE_FORK */
|
||||
|
@ -7382,13 +7394,17 @@ os_openpty_impl(PyObject *module)
|
|||
|
||||
/* change permission of slave */
|
||||
if (grantpt(master_fd) < 0) {
|
||||
int saved_errno = errno;
|
||||
PyOS_setsig(SIGCHLD, sig_saved);
|
||||
errno = saved_errno;
|
||||
goto posix_error;
|
||||
}
|
||||
|
||||
/* unlock slave */
|
||||
if (unlockpt(master_fd) < 0) {
|
||||
int saved_errno = errno;
|
||||
PyOS_setsig(SIGCHLD, sig_saved);
|
||||
errno = saved_errno;
|
||||
goto posix_error;
|
||||
}
|
||||
|
||||
|
@ -7741,8 +7757,9 @@ os_getgroups_impl(PyObject *module)
|
|||
|
||||
n = getgroups(n, grouplist);
|
||||
if (n == -1) {
|
||||
posix_error();
|
||||
PyMem_Free(grouplist);
|
||||
return posix_error();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *result = PyList_New(n);
|
||||
|
@ -8314,8 +8331,9 @@ os_setgroups(PyObject *module, PyObject *groups)
|
|||
}
|
||||
|
||||
if (setgroups(len, grouplist) < 0) {
|
||||
posix_error();
|
||||
PyMem_Free(grouplist);
|
||||
return posix_error();
|
||||
return NULL;
|
||||
}
|
||||
PyMem_Free(grouplist);
|
||||
Py_RETURN_NONE;
|
||||
|
@ -9711,10 +9729,13 @@ os_readv_impl(PyObject *module, int fd, PyObject *buffers)
|
|||
Py_END_ALLOW_THREADS
|
||||
} while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
|
||||
int saved_errno = errno;
|
||||
iov_cleanup(iov, buf, cnt);
|
||||
if (n < 0) {
|
||||
if (!async_err)
|
||||
if (!async_err) {
|
||||
errno = saved_errno;
|
||||
posix_error();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -9763,8 +9784,11 @@ os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset)
|
|||
} while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
|
||||
if (n < 0) {
|
||||
if (!async_err) {
|
||||
posix_error();
|
||||
}
|
||||
Py_DECREF(buffer);
|
||||
return (!async_err) ? posix_error() : NULL;
|
||||
return NULL;
|
||||
}
|
||||
if (n != length)
|
||||
_PyBytes_Resize(&buffer, n);
|
||||
|
@ -9861,9 +9885,11 @@ os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
|
|||
|
||||
#endif
|
||||
|
||||
int saved_errno = errno;
|
||||
iov_cleanup(iov, buf, cnt);
|
||||
if (n < 0) {
|
||||
if (!async_err) {
|
||||
errno = saved_errno;
|
||||
posix_error();
|
||||
}
|
||||
return -1;
|
||||
|
@ -10032,24 +10058,26 @@ os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj,
|
|||
} while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
_Py_END_SUPPRESS_IPH
|
||||
|
||||
int saved_errno = errno;
|
||||
if (sf.headers != NULL)
|
||||
iov_cleanup(sf.headers, hbuf, sf.hdr_cnt);
|
||||
if (sf.trailers != NULL)
|
||||
iov_cleanup(sf.trailers, tbuf, sf.trl_cnt);
|
||||
|
||||
if (ret < 0) {
|
||||
if ((errno == EAGAIN) || (errno == EBUSY)) {
|
||||
if ((saved_errno == EAGAIN) || (saved_errno == EBUSY)) {
|
||||
if (sbytes != 0) {
|
||||
// some data has been sent
|
||||
goto done;
|
||||
}
|
||||
else {
|
||||
// no data has been sent; upper application is supposed
|
||||
// to retry on EAGAIN or EBUSY
|
||||
return posix_error();
|
||||
}
|
||||
// no data has been sent; upper application is supposed
|
||||
// to retry on EAGAIN or EBUSY
|
||||
}
|
||||
return (!async_err) ? posix_error() : NULL;
|
||||
if (!async_err) {
|
||||
errno = saved_errno;
|
||||
posix_error();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
goto done;
|
||||
|
||||
|
@ -10366,10 +10394,10 @@ os_writev_impl(PyObject *module, int fd, PyObject *buffers)
|
|||
Py_END_ALLOW_THREADS
|
||||
} while (result < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
|
||||
iov_cleanup(iov, buf, cnt);
|
||||
if (result < 0 && !async_err)
|
||||
posix_error();
|
||||
|
||||
iov_cleanup(iov, buf, cnt);
|
||||
return result;
|
||||
}
|
||||
#endif /* HAVE_WRITEV */
|
||||
|
@ -10504,13 +10532,13 @@ os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
|
|||
|
||||
#endif
|
||||
|
||||
iov_cleanup(iov, buf, cnt);
|
||||
if (result < 0) {
|
||||
if (!async_err) {
|
||||
posix_error();
|
||||
}
|
||||
return -1;
|
||||
result = -1;
|
||||
}
|
||||
iov_cleanup(iov, buf, cnt);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -11072,12 +11100,13 @@ win32_putenv(PyObject *name, PyObject *value)
|
|||
Prefer _wputenv() to be compatible with C libraries using CRT
|
||||
variables and CRT functions using these variables (ex: getenv()). */
|
||||
int err = _wputenv(env);
|
||||
PyMem_Free(env);
|
||||
|
||||
if (err) {
|
||||
posix_error();
|
||||
PyMem_Free(env);
|
||||
return NULL;
|
||||
}
|
||||
PyMem_Free(env);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
@ -12919,10 +12948,12 @@ os_getxattr_impl(PyObject *module, path_t *path, path_t *attribute,
|
|||
Py_END_ALLOW_THREADS;
|
||||
|
||||
if (result < 0) {
|
||||
Py_DECREF(buffer);
|
||||
if (errno == ERANGE)
|
||||
if (errno == ERANGE) {
|
||||
Py_DECREF(buffer);
|
||||
continue;
|
||||
}
|
||||
path_error(path);
|
||||
Py_DECREF(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -13688,14 +13719,18 @@ _Py_COMP_DIAG_POP
|
|||
}
|
||||
Py_END_ALLOW_THREADS
|
||||
}
|
||||
int saved_errno = errno;
|
||||
#if defined(MS_WINDOWS) && !USE_UNICODE_WCHAR_CACHE
|
||||
PyMem_Free(path);
|
||||
#else /* USE_UNICODE_WCHAR_CACHE */
|
||||
Py_DECREF(ub);
|
||||
#endif /* USE_UNICODE_WCHAR_CACHE */
|
||||
|
||||
if (result != 0)
|
||||
return path_object_error(self->path);
|
||||
if (result != 0) {
|
||||
errno = saved_errno;
|
||||
path_object_error(self->path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _pystat_fromstructstat(module, &st);
|
||||
}
|
||||
|
@ -13891,17 +13926,22 @@ _Py_COMP_DIAG_PUSH
|
|||
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
|
||||
const wchar_t *path = PyUnicode_AsUnicode(unicode);
|
||||
result = LSTAT(path, &stat);
|
||||
int saved_errno = errno;
|
||||
Py_DECREF(unicode);
|
||||
_Py_COMP_DIAG_POP
|
||||
#else /* USE_UNICODE_WCHAR_CACHE */
|
||||
wchar_t *path = PyUnicode_AsWideCharString(unicode, NULL);
|
||||
Py_DECREF(unicode);
|
||||
result = LSTAT(path, &stat);
|
||||
|
||||
int saved_errno = errno;
|
||||
PyMem_Free(path);
|
||||
#endif /* USE_UNICODE_WCHAR_CACHE */
|
||||
|
||||
if (result != 0)
|
||||
if (result != 0) {
|
||||
errno = saved_errno;
|
||||
return path_object_error(self->path);
|
||||
}
|
||||
|
||||
self->win32_file_index = stat.st_ino;
|
||||
self->got_file_index = 1;
|
||||
|
@ -14468,12 +14508,12 @@ os_scandir_impl(PyObject *module, path_t *path)
|
|||
iterator->handle = FindFirstFileW(path_strW, &iterator->file_data);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
PyMem_Free(path_strW);
|
||||
|
||||
if (iterator->handle == INVALID_HANDLE_VALUE) {
|
||||
path_error(&iterator->path);
|
||||
PyMem_Free(path_strW);
|
||||
goto error;
|
||||
}
|
||||
PyMem_Free(path_strW);
|
||||
#else /* POSIX */
|
||||
errno = 0;
|
||||
#ifdef HAVE_FDOPENDIR
|
||||
|
|
|
@ -1290,8 +1290,8 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
|
|||
self->epfd = fd;
|
||||
}
|
||||
if (self->epfd < 0) {
|
||||
Py_DECREF(self);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1973,8 +1973,8 @@ newKqueue_Object(PyTypeObject *type, SOCKET fd)
|
|||
self->kqfd = fd;
|
||||
}
|
||||
if (self->kqfd < 0) {
|
||||
Py_DECREF(self);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -5351,8 +5351,8 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto,
|
|||
|
||||
if (!support_wsa_no_inherit) {
|
||||
if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
|
||||
closesocket(fd);
|
||||
PyErr_SetFromWindowsErr(0);
|
||||
closesocket(fd);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -5495,8 +5495,9 @@ socket_gethostname(PyObject *self, PyObject *unused)
|
|||
name,
|
||||
&size))
|
||||
{
|
||||
PyErr_SetFromWindowsErr(0);
|
||||
PyMem_Free(name);
|
||||
return PyErr_SetFromWindowsErr(0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = PyUnicode_FromWideChar(name, size);
|
||||
|
@ -6083,8 +6084,8 @@ socket_dup(PyObject *self, PyObject *fdobj)
|
|||
return set_error();
|
||||
|
||||
if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
|
||||
closesocket(newfd);
|
||||
PyErr_SetFromWindowsErr(0);
|
||||
closesocket(newfd);
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
|
@ -6528,11 +6529,12 @@ socket_inet_ntop(PyObject *self, PyObject *args)
|
|||
|
||||
/* inet_ntop guarantee NUL-termination of resulting string. */
|
||||
retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
|
||||
PyBuffer_Release(&packed_ip);
|
||||
if (!retval) {
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
PyBuffer_Release(&packed_ip);
|
||||
return NULL;
|
||||
} else {
|
||||
PyBuffer_Release(&packed_ip);
|
||||
return PyUnicode_FromString(retval);
|
||||
}
|
||||
}
|
||||
|
@ -6862,8 +6864,8 @@ socket_if_nameindex(PyObject *self, PyObject *arg)
|
|||
|
||||
ni = if_nameindex();
|
||||
if (ni == NULL) {
|
||||
Py_DECREF(list);
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
Py_DECREF(list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -7556,7 +7556,7 @@ decode_code_page_errors(UINT code_page,
|
|||
if (err != ERROR_NO_UNICODE_TRANSLATION
|
||||
&& err != ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
PyErr_SetFromWindowsErr(0);
|
||||
PyErr_SetFromWindowsErr(err);
|
||||
goto error;
|
||||
}
|
||||
insize++;
|
||||
|
|
|
@ -1687,6 +1687,7 @@ _Py_fopen_obj(PyObject *path, const char *mode)
|
|||
Py_END_ALLOW_THREADS
|
||||
} while (f == NULL
|
||||
&& errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
int saved_errno = errno;
|
||||
#if !USE_UNICODE_WCHAR_CACHE
|
||||
PyMem_Free(wpath);
|
||||
#endif /* USE_UNICODE_WCHAR_CACHE */
|
||||
|
@ -1711,13 +1712,14 @@ _Py_fopen_obj(PyObject *path, const char *mode)
|
|||
Py_END_ALLOW_THREADS
|
||||
} while (f == NULL
|
||||
&& errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
|
||||
int saved_errno = errno;
|
||||
Py_DECREF(bytes);
|
||||
#endif
|
||||
if (async_err)
|
||||
return NULL;
|
||||
|
||||
if (f == NULL) {
|
||||
errno = saved_errno;
|
||||
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path);
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue