summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Library/2023-08-14-11-18-13.gh-issue-107913.4ooY6i.rst3
-rw-r--r--Modules/_cursesmodule.c2
-rw-r--r--Modules/_io/fileio.c12
-rw-r--r--Modules/_io/winconsoleio.c2
-rw-r--r--Modules/_localemodule.c2
-rw-r--r--Modules/_multiprocessing/semaphore.c9
-rw-r--r--Modules/_ssl.c8
-rw-r--r--Modules/faulthandler.c3
-rw-r--r--Modules/fcntlmodule.c5
-rw-r--r--Modules/getpath.c3
-rw-r--r--Modules/mmapmodule.c2
-rw-r--r--Modules/overlapped.c3
-rw-r--r--Modules/posixmodule.c128
-rw-r--r--Modules/selectmodule.c4
-rw-r--r--Modules/socketmodule.c12
-rw-r--r--Objects/unicodeobject.c2
-rw-r--r--Python/fileutils.c4
17 files changed, 129 insertions, 75 deletions
diff --git a/Misc/NEWS.d/next/Library/2023-08-14-11-18-13.gh-issue-107913.4ooY6i.rst b/Misc/NEWS.d/next/Library/2023-08-14-11-18-13.gh-issue-107913.4ooY6i.rst
new file mode 100644
index 0000000..de5e21a
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-14-11-18-13.gh-issue-107913.4ooY6i.rst
@@ -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.
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 1f5afa6..d339a8a 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -3069,8 +3069,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);
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index d52bcd5..15df1b2 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -393,6 +393,11 @@ _io_FileIO___init___impl(fileio *self, PyObject *nameobj, const char *mode,
if (async_err)
goto error;
+
+ if (self->fd < 0) {
+ PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);
+ goto error;
+ }
}
else {
PyObject *fdobj;
@@ -424,12 +429,7 @@ _io_FileIO___init___impl(fileio *self, PyObject *nameobj, const char *mode,
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)
@@ -1057,8 +1057,8 @@ _io_FileIO_truncate_impl(fileio *self, PyTypeObject *cls, PyObject *posobj)
Py_END_ALLOW_THREADS
if (ret != 0) {
- Py_DECREF(posobj);
PyErr_SetFromErrno(PyExc_OSError);
+ Py_DECREF(posobj);
return NULL;
}
diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c
index 875c90c..e10a22c 100644
--- a/Modules/_io/winconsoleio.c
+++ b/Modules/_io/winconsoleio.c
@@ -377,8 +377,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;
}
}
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 34915de..e4b956b 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -736,8 +736,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);
diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c
index 771f86e..d22b8d1 100644
--- a/Modules/_multiprocessing/semaphore.c
+++ b/Modules/_multiprocessing/semaphore.c
@@ -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
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index c001b87..be03325 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -3914,8 +3914,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__);
@@ -3935,8 +3935,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__);
@@ -4165,8 +4165,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__);
@@ -4213,8 +4213,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__);
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index aecb64d..f05cdd9 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -415,11 +415,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;
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 3bf5830..fd03abf 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -212,11 +212,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);
}
@@ -241,8 +242,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);
diff --git a/Modules/getpath.c b/Modules/getpath.c
index fb1656a..71e23e1 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -342,11 +342,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) {
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 44d5b26..c8cd7e5 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -1356,6 +1356,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
m_obj->data = mmap(NULL, map_size, prot, flags, fd, offset);
Py_END_ALLOW_THREADS
+ int saved_errno = errno;
if (devzero != -1) {
close(devzero);
}
@@ -1363,6 +1364,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;
}
diff --git a/Modules/overlapped.c b/Modules/overlapped.c
index 34be3a4..c682e6a 100644
--- a/Modules/overlapped.c
+++ b/Modules/overlapped.c
@@ -370,8 +370,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);
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 8eb25fc..0436571 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -3877,9 +3877,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);
@@ -3927,8 +3928,9 @@ posix_getcwd(int use_bytes)
return PyErr_NoMemory();
}
if (cwd == NULL) {
+ posix_error();
PyMem_RawFree(buf);
- return posix_error();
+ return NULL;
}
PyObject *obj;
@@ -4140,8 +4142,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 {
@@ -4154,12 +4156,12 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
Py_SETREF(v, PyUnicode_EncodeFSDefault(v));
}
if (v == NULL) {
- Py_SETREF(list, NULL);
+ Py_CLEAR(list);
break;
}
if (PyList_Append(list, v) != 0) {
Py_DECREF(v);
- Py_SETREF(list, NULL);
+ Py_CLEAR(list);
break;
}
Py_DECREF(v);
@@ -4170,8 +4172,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);
@@ -4180,8 +4182,8 @@ exit:
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);
}
}
}
@@ -4243,7 +4245,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
@@ -4265,8 +4268,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;
}
}
@@ -6609,8 +6612,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;
}
@@ -6914,11 +6918,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: {
@@ -7315,12 +7320,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]
@@ -7638,6 +7646,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();
@@ -7646,8 +7655,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 */
@@ -7683,6 +7694,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();
@@ -7691,8 +7703,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 */
@@ -8229,13 +8243,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;
}
@@ -8599,8 +8617,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);
@@ -9167,8 +9186,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;
@@ -10615,10 +10635,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;
}
@@ -10667,8 +10690,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);
@@ -10765,9 +10791,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;
@@ -10936,24 +10964,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;
@@ -11270,10 +11300,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 */
@@ -11408,13 +11438,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;
}
@@ -11976,12 +12006,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;
}
@@ -13823,10 +13854,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;
}
@@ -14593,14 +14626,19 @@ DirEntry_fetch_stat(PyObject *module, DirEntry *self, int follow_symlinks)
}
Py_END_ALLOW_THREADS
}
+
+ int saved_errno = errno;
#if defined(MS_WINDOWS)
PyMem_Free(path);
#else
Py_DECREF(ub);
#endif
- 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);
}
@@ -14792,10 +14830,14 @@ os_DirEntry_inode_impl(DirEntry *self)
wchar_t *path = PyUnicode_AsWideCharString(unicode, NULL);
Py_DECREF(unicode);
result = LSTAT(path, &stat);
+
+ int saved_errno = errno;
PyMem_Free(path);
- 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;
@@ -15359,12 +15401,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
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 94d2469..4987cf0 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -1294,8 +1294,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;
}
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index b4094b8..8cc45e2 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -5398,8 +5398,8 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto,
}
if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
- closesocket(fd);
PyErr_SetFromWindowsErr(0);
+ closesocket(fd);
return -1;
}
@@ -5613,8 +5613,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);
@@ -6212,8 +6213,8 @@ socket_dup(PyObject *self, PyObject *fdobj)
}
if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
- closesocket(newfd);
PyErr_SetFromWindowsErr(0);
+ closesocket(newfd);
return NULL;
}
#else
@@ -6660,11 +6661,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);
}
}
@@ -7003,8 +7005,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;
}
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 2f6f413..045b48c 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -7101,7 +7101,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++;
diff --git a/Python/fileutils.c b/Python/fileutils.c
index 9c49983..9bc1de2 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -1790,6 +1790,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;
PyMem_Free(wpath);
#else
PyObject *bytes;
@@ -1812,13 +1813,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;
}