aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2023-10-03 23:32:21 +0300
committershadchin <shadchin@yandex-team.com>2023-10-03 23:48:51 +0300
commit01ffd024041ac933854c367fb8d1b5682d19883f (patch)
treeb70aa497ba132a133ccece49f7763427dcd0743f /contrib/tools/python3/src/Modules
parenta33fdb9a34581fd124e92535153b1f1fdeca6aaf (diff)
downloadydb-01ffd024041ac933854c367fb8d1b5682d19883f.tar.gz
Update Python 3 to 3.11.6
Diffstat (limited to 'contrib/tools/python3/src/Modules')
-rw-r--r--contrib/tools/python3/src/Modules/_io/clinic/textio.c.h8
-rw-r--r--contrib/tools/python3/src/Modules/_io/fileio.c12
-rw-r--r--contrib/tools/python3/src/Modules/_io/iobase.c21
-rw-r--r--contrib/tools/python3/src/Modules/_io/textio.c7
-rw-r--r--contrib/tools/python3/src/Modules/_io/winconsoleio.c2
-rw-r--r--contrib/tools/python3/src/Modules/_localemodule.c2
-rw-r--r--contrib/tools/python3/src/Modules/_multiprocessing/semaphore.c9
-rw-r--r--contrib/tools/python3/src/Modules/_posixsubprocess.c21
-rw-r--r--contrib/tools/python3/src/Modules/_sqlite/ya.make4
-rw-r--r--contrib/tools/python3/src/Modules/_sre/sre.h1
-rw-r--r--contrib/tools/python3/src/Modules/_sre/sre_lib.h6
-rw-r--r--contrib/tools/python3/src/Modules/_ssl.c8
-rw-r--r--contrib/tools/python3/src/Modules/_threadmodule.c71
-rw-r--r--contrib/tools/python3/src/Modules/_xxtestfuzz/fuzzer.c36
-rw-r--r--contrib/tools/python3/src/Modules/faulthandler.c6
-rw-r--r--contrib/tools/python3/src/Modules/fcntlmodule.c5
-rw-r--r--contrib/tools/python3/src/Modules/getpath.c3
-rw-r--r--contrib/tools/python3/src/Modules/mmapmodule.c2
-rw-r--r--contrib/tools/python3/src/Modules/overlapped.c3
-rw-r--r--contrib/tools/python3/src/Modules/posixmodule.c243
-rw-r--r--contrib/tools/python3/src/Modules/selectmodule.c4
-rw-r--r--contrib/tools/python3/src/Modules/socketmodule.c12
-rw-r--r--contrib/tools/python3/src/Modules/ya.make4
23 files changed, 312 insertions, 178 deletions
diff --git a/contrib/tools/python3/src/Modules/_io/clinic/textio.c.h b/contrib/tools/python3/src/Modules/_io/clinic/textio.c.h
index 91755dc3ed..c220b44988 100644
--- a/contrib/tools/python3/src/Modules/_io/clinic/textio.c.h
+++ b/contrib/tools/python3/src/Modules/_io/clinic/textio.c.h
@@ -526,7 +526,11 @@ exit:
PyDoc_STRVAR(_io_TextIOWrapper_tell__doc__,
"tell($self, /)\n"
"--\n"
-"\n");
+"\n"
+"Return the stream position as an opaque number.\n"
+"\n"
+"The return value of tell() can be given as input to seek(), to restore a\n"
+"previous stream position.");
#define _IO_TEXTIOWRAPPER_TELL_METHODDEF \
{"tell", (PyCFunction)_io_TextIOWrapper_tell, METH_NOARGS, _io_TextIOWrapper_tell__doc__},
@@ -689,4 +693,4 @@ _io_TextIOWrapper_close(textio *self, PyObject *Py_UNUSED(ignored))
{
return _io_TextIOWrapper_close_impl(self);
}
-/*[clinic end generated code: output=f9bda53adf576a8e input=a9049054013a1b77]*/
+/*[clinic end generated code: output=4865229ff65da09a input=a9049054013a1b77]*/
diff --git a/contrib/tools/python3/src/Modules/_io/fileio.c b/contrib/tools/python3/src/Modules/_io/fileio.c
index 4496609afc..fee97f266f 100644
--- a/contrib/tools/python3/src/Modules/_io/fileio.c
+++ b/contrib/tools/python3/src/Modules/_io/fileio.c
@@ -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;
}
diff --git a/contrib/tools/python3/src/Modules/_io/iobase.c b/contrib/tools/python3/src/Modules/_io/iobase.c
index 6ae43a8b3b..8424fabca9 100644
--- a/contrib/tools/python3/src/Modules/_io/iobase.c
+++ b/contrib/tools/python3/src/Modules/_io/iobase.c
@@ -82,15 +82,22 @@ iobase_unsupported(const char *message)
/* Positioning */
PyDoc_STRVAR(iobase_seek_doc,
- "Change stream position.\n"
+ "seek($self, offset, whence=os.SEEK_SET, /)\n"
+ "--\n"
"\n"
- "Change the stream position to the given byte offset. The offset is\n"
- "interpreted relative to the position indicated by whence. Values\n"
- "for whence are:\n"
+ "Change the stream position to the given byte offset.\n"
"\n"
- "* 0 -- start of stream (the default); offset should be zero or positive\n"
- "* 1 -- current stream position; offset may be negative\n"
- "* 2 -- end of stream; offset is usually negative\n"
+ " offset\n"
+ " The stream position, relative to \'whence\'.\n"
+ " whence\n"
+ " The relative position to seek from.\n"
+ "\n"
+ "The offset is interpreted relative to the position indicated by whence.\n"
+ "Values for whence are:\n"
+ "\n"
+ "* os.SEEK_SET or 0 -- start of stream (the default); offset should be zero or positive\n"
+ "* os.SEEK_CUR or 1 -- current stream position; offset may be negative\n"
+ "* os.SEEK_END or 2 -- end of stream; offset is usually negative\n"
"\n"
"Return the new absolute position.");
diff --git a/contrib/tools/python3/src/Modules/_io/textio.c b/contrib/tools/python3/src/Modules/_io/textio.c
index 403687dac0..7d5afb4c44 100644
--- a/contrib/tools/python3/src/Modules/_io/textio.c
+++ b/contrib/tools/python3/src/Modules/_io/textio.c
@@ -2627,11 +2627,16 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence)
/*[clinic input]
_io.TextIOWrapper.tell
+
+Return the stream position as an opaque number.
+
+The return value of tell() can be given as input to seek(), to restore a
+previous stream position.
[clinic start generated code]*/
static PyObject *
_io_TextIOWrapper_tell_impl(textio *self)
-/*[clinic end generated code: output=4f168c08bf34ad5f input=9a2caf88c24f9ddf]*/
+/*[clinic end generated code: output=4f168c08bf34ad5f input=0852d627d76fb520]*/
{
PyObject *res;
PyObject *posobj = NULL;
diff --git a/contrib/tools/python3/src/Modules/_io/winconsoleio.c b/contrib/tools/python3/src/Modules/_io/winconsoleio.c
index c8f3481e66..89431b1e4c 100644
--- a/contrib/tools/python3/src/Modules/_io/winconsoleio.c
+++ b/contrib/tools/python3/src/Modules/_io/winconsoleio.c
@@ -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;
}
}
diff --git a/contrib/tools/python3/src/Modules/_localemodule.c b/contrib/tools/python3/src/Modules/_localemodule.c
index 23c38e14d9..ac9709cabc 100644
--- a/contrib/tools/python3/src/Modules/_localemodule.c
+++ b/contrib/tools/python3/src/Modules/_localemodule.c
@@ -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);
diff --git a/contrib/tools/python3/src/Modules/_multiprocessing/semaphore.c b/contrib/tools/python3/src/Modules/_multiprocessing/semaphore.c
index f5fd3257f0..49174d39f1 100644
--- a/contrib/tools/python3/src/Modules/_multiprocessing/semaphore.c
+++ b/contrib/tools/python3/src/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/contrib/tools/python3/src/Modules/_posixsubprocess.c b/contrib/tools/python3/src/Modules/_posixsubprocess.c
index ad9daaede4..072519c91a 100644
--- a/contrib/tools/python3/src/Modules/_posixsubprocess.c
+++ b/contrib/tools/python3/src/Modules/_posixsubprocess.c
@@ -537,7 +537,7 @@ reset_signal_handlers(const sigset_t *child_sigmask)
* required by POSIX but not supported natively on Linux. Another reason to
* avoid this family of functions is that sharing an address space between
* processes running with different privileges is inherently insecure.
- * See bpo-35823 for further discussion and references.
+ * See https://bugs.python.org/issue35823 for discussion and references.
*
* In some C libraries, setrlimit() has the same thread list/signalling
* behavior since resource limits were per-thread attributes before
@@ -774,6 +774,7 @@ do_fork_exec(char *const exec_array[],
pid_t pid;
#ifdef VFORK_USABLE
+ PyThreadState *vfork_tstate_save;
if (child_sigmask) {
/* These are checked by our caller; verify them in debug builds. */
assert(!call_setuid);
@@ -781,8 +782,23 @@ do_fork_exec(char *const exec_array[],
assert(!call_setgroups);
assert(preexec_fn == Py_None);
+ /* Drop the GIL so that other threads can continue execution while this
+ * thread in the parent remains blocked per vfork-semantics on the
+ * child's exec syscall outcome. Exec does filesystem access which
+ * can take an arbitrarily long time. This addresses GH-104372.
+ *
+ * The vfork'ed child still runs in our address space. Per POSIX it
+ * must be limited to nothing but exec, but the Linux implementation
+ * is a little more usable. See the child_exec() comment - The child
+ * MUST NOT re-acquire the GIL.
+ */
+ vfork_tstate_save = PyEval_SaveThread();
pid = vfork();
- if (pid == -1) {
+ if (pid != 0) {
+ // Not in the child process, reacquire the GIL.
+ PyEval_RestoreThread(vfork_tstate_save);
+ }
+ if (pid == (pid_t)-1) {
/* If vfork() fails, fall back to using fork(). When it isn't
* allowed in a process by the kernel, vfork can return -1
* with errno EINVAL. https://bugs.python.org/issue47151. */
@@ -795,6 +811,7 @@ do_fork_exec(char *const exec_array[],
}
if (pid != 0) {
+ // Parent process.
return pid;
}
diff --git a/contrib/tools/python3/src/Modules/_sqlite/ya.make b/contrib/tools/python3/src/Modules/_sqlite/ya.make
index 1d16438d62..c32056e4a7 100644
--- a/contrib/tools/python3/src/Modules/_sqlite/ya.make
+++ b/contrib/tools/python3/src/Modules/_sqlite/ya.make
@@ -2,9 +2,9 @@
LIBRARY()
-VERSION(3.11.5)
+VERSION(3.11.6)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.11.5.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.11.6.tar.gz)
LICENSE(Python-2.0)
diff --git a/contrib/tools/python3/src/Modules/_sre/sre.h b/contrib/tools/python3/src/Modules/_sre/sre.h
index 52ae3e11b5..8d09b110ed 100644
--- a/contrib/tools/python3/src/Modules/_sre/sre.h
+++ b/contrib/tools/python3/src/Modules/_sre/sre.h
@@ -83,6 +83,7 @@ typedef struct {
size_t data_stack_base;
/* current repeat context */
SRE_REPEAT *repeat;
+ unsigned int sigcount;
} SRE_STATE;
typedef struct {
diff --git a/contrib/tools/python3/src/Modules/_sre/sre_lib.h b/contrib/tools/python3/src/Modules/_sre/sre_lib.h
index e83149825e..f8d556b2db 100644
--- a/contrib/tools/python3/src/Modules/_sre/sre_lib.h
+++ b/contrib/tools/python3/src/Modules/_sre/sre_lib.h
@@ -563,7 +563,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
Py_ssize_t alloc_pos, ctx_pos = -1;
Py_ssize_t ret = 0;
int jump;
- unsigned int sigcount=0;
+ unsigned int sigcount = state->sigcount;
SRE(match_context)* ctx;
SRE(match_context)* nextctx;
@@ -1565,8 +1565,10 @@ exit:
ctx_pos = ctx->last_ctx_pos;
jump = ctx->jump;
DATA_POP_DISCARD(ctx);
- if (ctx_pos == -1)
+ if (ctx_pos == -1) {
+ state->sigcount = sigcount;
return ret;
+ }
DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
switch (jump) {
diff --git a/contrib/tools/python3/src/Modules/_ssl.c b/contrib/tools/python3/src/Modules/_ssl.c
index f5fb5bd0e2..8f3766cc48 100644
--- a/contrib/tools/python3/src/Modules/_ssl.c
+++ b/contrib/tools/python3/src/Modules/_ssl.c
@@ -3902,8 +3902,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__);
@@ -3923,8 +3923,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__);
@@ -4151,8 +4151,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__);
@@ -4199,8 +4199,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/contrib/tools/python3/src/Modules/_threadmodule.c b/contrib/tools/python3/src/Modules/_threadmodule.c
index 199e3b89d9..625e4e6e77 100644
--- a/contrib/tools/python3/src/Modules/_threadmodule.c
+++ b/contrib/tools/python3/src/Modules/_threadmodule.c
@@ -485,6 +485,18 @@ PyDoc_STRVAR(rlock_release_save_doc,
\n\
For internal use by `threading.Condition`.");
+static PyObject *
+rlock_recursion_count(rlockobject *self, PyObject *Py_UNUSED(ignored))
+{
+ unsigned long tid = PyThread_get_thread_ident();
+ return PyLong_FromUnsignedLong(
+ self->rlock_owner == tid ? self->rlock_count : 0UL);
+}
+
+PyDoc_STRVAR(rlock_recursion_count_doc,
+"_recursion_count() -> int\n\
+\n\
+For internal use by reentrancy checks.");
static PyObject *
rlock_is_owned(rlockobject *self, PyObject *Py_UNUSED(ignored))
@@ -560,6 +572,8 @@ static PyMethodDef rlock_methods[] = {
METH_VARARGS, rlock_acquire_restore_doc},
{"_release_save", (PyCFunction)rlock_release_save,
METH_NOARGS, rlock_release_save_doc},
+ {"_recursion_count", (PyCFunction)rlock_recursion_count,
+ METH_NOARGS, rlock_recursion_count_doc},
{"__enter__", _PyCFunction_CAST(rlock_acquire),
METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc},
{"__exit__", (PyCFunction)rlock_release,
@@ -1053,22 +1067,22 @@ _localdummy_destroyed(PyObject *localweakref, PyObject *dummyweakref)
/* Module functions */
struct bootstate {
- PyInterpreterState *interp;
+ PyThreadState *tstate;
PyObject *func;
PyObject *args;
PyObject *kwargs;
- PyThreadState *tstate;
- _PyRuntimeState *runtime;
};
static void
-thread_bootstate_free(struct bootstate *boot)
+thread_bootstate_free(struct bootstate *boot, int decref)
{
- Py_DECREF(boot->func);
- Py_DECREF(boot->args);
- Py_XDECREF(boot->kwargs);
- PyMem_Free(boot);
+ if (decref) {
+ Py_DECREF(boot->func);
+ Py_DECREF(boot->args);
+ Py_XDECREF(boot->kwargs);
+ }
+ PyMem_RawFree(boot);
}
@@ -1076,9 +1090,27 @@ static void
thread_run(void *boot_raw)
{
struct bootstate *boot = (struct bootstate *) boot_raw;
- PyThreadState *tstate;
+ PyThreadState *tstate = boot->tstate;
+
+ // gh-108987: If _thread.start_new_thread() is called before or while
+ // Python is being finalized, thread_run() can called *after*.
+ // _PyRuntimeState_SetFinalizing() is called. At this point, all Python
+ // threads must exit, except of the thread calling Py_Finalize() whch holds
+ // the GIL and must not exit.
+ //
+ // At this stage, tstate can be a dangling pointer (point to freed memory),
+ // it's ok to call _PyThreadState_MustExit() with a dangling pointer.
+ if (_PyThreadState_MustExit(tstate)) {
+ // Don't call PyThreadState_Clear() nor _PyThreadState_DeleteCurrent().
+ // These functions are called on tstate indirectly by Py_Finalize()
+ // which calls _PyInterpreterState_Clear().
+ //
+ // Py_DECREF() cannot be called because the GIL is not held: leak
+ // references on purpose. Python is being finalized anyway.
+ thread_bootstate_free(boot, 0);
+ goto exit;
+ }
- tstate = boot->tstate;
tstate->thread_id = PyThread_get_thread_ident();
#ifdef PY_HAVE_THREAD_NATIVE_ID
tstate->native_thread_id = PyThread_get_thread_native_id();
@@ -1102,20 +1134,22 @@ thread_run(void *boot_raw)
Py_DECREF(res);
}
- thread_bootstate_free(boot);
+ thread_bootstate_free(boot, 1);
+
tstate->interp->threads.count--;
PyThreadState_Clear(tstate);
_PyThreadState_DeleteCurrent(tstate);
+exit:
// bpo-44434: Don't call explicitly PyThread_exit_thread(). On Linux with
// the glibc, pthread_exit() can abort the whole process if dlopen() fails
// to open the libgcc_s.so library (ex: EMFILE error).
+ return;
}
static PyObject *
thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
{
- _PyRuntimeState *runtime = &_PyRuntime;
PyObject *func, *args, *kwargs = NULL;
if (!PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3,
@@ -1144,17 +1178,18 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
return NULL;
}
- struct bootstate *boot = PyMem_NEW(struct bootstate, 1);
+ // gh-109795: Use PyMem_RawMalloc() instead of PyMem_Malloc(),
+ // because it should be possible to call thread_bootstate_free()
+ // without holding the GIL.
+ struct bootstate *boot = PyMem_RawMalloc(sizeof(struct bootstate));
if (boot == NULL) {
return PyErr_NoMemory();
}
- boot->interp = _PyInterpreterState_GET();
- boot->tstate = _PyThreadState_Prealloc(boot->interp);
+ boot->tstate = _PyThreadState_Prealloc(interp);
if (boot->tstate == NULL) {
- PyMem_Free(boot);
+ PyMem_RawFree(boot);
return PyErr_NoMemory();
}
- boot->runtime = runtime;
boot->func = Py_NewRef(func);
boot->args = Py_NewRef(args);
boot->kwargs = Py_XNewRef(kwargs);
@@ -1163,7 +1198,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
if (ident == PYTHREAD_INVALID_THREAD_ID) {
PyErr_SetString(ThreadError, "can't start new thread");
PyThreadState_Clear(boot->tstate);
- thread_bootstate_free(boot);
+ thread_bootstate_free(boot, 1);
return NULL;
}
return PyLong_FromUnsignedLong(ident);
diff --git a/contrib/tools/python3/src/Modules/_xxtestfuzz/fuzzer.c b/contrib/tools/python3/src/Modules/_xxtestfuzz/fuzzer.c
index 366e81a545..0c9f842725 100644
--- a/contrib/tools/python3/src/Modules/_xxtestfuzz/fuzzer.c
+++ b/contrib/tools/python3/src/Modules/_xxtestfuzz/fuzzer.c
@@ -188,37 +188,33 @@ static int fuzz_json_loads(const char* data, size_t size) {
#define MAX_RE_TEST_SIZE 0x10000
-PyObject* sre_compile_method = NULL;
-PyObject* sre_error_exception = NULL;
-int SRE_FLAG_DEBUG = 0;
+PyObject* re_compile_method = NULL;
+PyObject* re_error_exception = NULL;
+int RE_FLAG_DEBUG = 0;
/* Called by LLVMFuzzerTestOneInput for initialization */
static int init_sre_compile(void) {
/* Import sre_compile.compile and sre.error */
- PyObject* sre_compile_module = PyImport_ImportModule("sre_compile");
- if (sre_compile_module == NULL) {
+ PyObject* re_module = PyImport_ImportModule("re");
+ if (re_module == NULL) {
return 0;
}
- sre_compile_method = PyObject_GetAttrString(sre_compile_module, "compile");
- if (sre_compile_method == NULL) {
+ re_compile_method = PyObject_GetAttrString(re_module, "compile");
+ if (re_compile_method == NULL) {
return 0;
}
- PyObject* sre_constants = PyImport_ImportModule("sre_constants");
- if (sre_constants == NULL) {
- return 0;
- }
- sre_error_exception = PyObject_GetAttrString(sre_constants, "error");
- if (sre_error_exception == NULL) {
+ re_error_exception = PyObject_GetAttrString(re_module, "error");
+ if (re_error_exception == NULL) {
return 0;
}
- PyObject* debug_flag = PyObject_GetAttrString(sre_constants, "SRE_FLAG_DEBUG");
+ PyObject* debug_flag = PyObject_GetAttrString(re_module, "DEBUG");
if (debug_flag == NULL) {
return 0;
}
- SRE_FLAG_DEBUG = PyLong_AsLong(debug_flag);
+ RE_FLAG_DEBUG = PyLong_AsLong(debug_flag);
return 1;
}
-/* Fuzz _sre.compile(x) */
+/* Fuzz re.compile(x) */
static int fuzz_sre_compile(const char* data, size_t size) {
/* Ignore really long regex patterns that will timeout the fuzzer */
if (size > MAX_RE_TEST_SIZE) {
@@ -231,7 +227,7 @@ static int fuzz_sre_compile(const char* data, size_t size) {
uint16_t flags = ((uint16_t*) data)[0];
/* We remove the SRE_FLAG_DEBUG if present. This is because it
prints to stdout which greatly decreases fuzzing speed */
- flags &= ~SRE_FLAG_DEBUG;
+ flags &= ~RE_FLAG_DEBUG;
/* Pull the pattern from the remaining bytes */
PyObject* pattern_bytes = PyBytes_FromStringAndSize(data + 2, size - 2);
@@ -244,9 +240,9 @@ static int fuzz_sre_compile(const char* data, size_t size) {
return 0;
}
- /* compiled = _sre.compile(data[2:], data[0:2] */
+ /* compiled = re.compile(data[2:], data[0:2] */
PyObject* compiled = PyObject_CallFunctionObjArgs(
- sre_compile_method, pattern_bytes, flags_obj, NULL);
+ re_compile_method, pattern_bytes, flags_obj, NULL);
/* Ignore ValueError as the fuzzer will more than likely
generate some invalid combination of flags */
if (compiled == NULL && PyErr_ExceptionMatches(PyExc_ValueError)) {
@@ -262,7 +258,7 @@ static int fuzz_sre_compile(const char* data, size_t size) {
PyErr_Clear();
}
/* Ignore re.error */
- if (compiled == NULL && PyErr_ExceptionMatches(sre_error_exception)) {
+ if (compiled == NULL && PyErr_ExceptionMatches(re_error_exception)) {
PyErr_Clear();
}
diff --git a/contrib/tools/python3/src/Modules/faulthandler.c b/contrib/tools/python3/src/Modules/faulthandler.c
index 04995d2e74..520b7b603e 100644
--- a/contrib/tools/python3/src/Modules/faulthandler.c
+++ b/contrib/tools/python3/src/Modules/faulthandler.c
@@ -231,7 +231,6 @@ faulthandler_dump_traceback(int fd, int all_threads,
PyInterpreterState *interp)
{
static volatile int reentrant = 0;
- PyThreadState *tstate;
if (reentrant)
return;
@@ -246,7 +245,7 @@ faulthandler_dump_traceback(int fd, int all_threads,
fault if the thread released the GIL, and so this function cannot be
used. Read the thread specific storage (TSS) instead: call
PyGILState_GetThisThreadState(). */
- tstate = PyGILState_GetThisThreadState();
+ PyThreadState *tstate = PyGILState_GetThisThreadState();
if (all_threads) {
(void)_Py_DumpTracebackThreads(fd, NULL, tstate);
@@ -469,11 +468,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/contrib/tools/python3/src/Modules/fcntlmodule.c b/contrib/tools/python3/src/Modules/fcntlmodule.c
index ea9b2bc14a..e4bdd3a493 100644
--- a/contrib/tools/python3/src/Modules/fcntlmodule.c
+++ b/contrib/tools/python3/src/Modules/fcntlmodule.c
@@ -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);
diff --git a/contrib/tools/python3/src/Modules/getpath.c b/contrib/tools/python3/src/Modules/getpath.c
index 22b105eadc..46cad45695 100644
--- a/contrib/tools/python3/src/Modules/getpath.c
+++ b/contrib/tools/python3/src/Modules/getpath.c
@@ -348,11 +348,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/contrib/tools/python3/src/Modules/mmapmodule.c b/contrib/tools/python3/src/Modules/mmapmodule.c
index 8ff63f5118..a8d48ec6f3 100644
--- a/contrib/tools/python3/src/Modules/mmapmodule.c
+++ b/contrib/tools/python3/src/Modules/mmapmodule.c
@@ -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;
}
diff --git a/contrib/tools/python3/src/Modules/overlapped.c b/contrib/tools/python3/src/Modules/overlapped.c
index 9334dcaa2e..d1f2f11d48 100644
--- a/contrib/tools/python3/src/Modules/overlapped.c
+++ b/contrib/tools/python3/src/Modules/overlapped.c
@@ -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);
diff --git a/contrib/tools/python3/src/Modules/posixmodule.c b/contrib/tools/python3/src/Modules/posixmodule.c
index 6afc8088c2..a45e8887da 100644
--- a/contrib/tools/python3/src/Modules/posixmodule.c
+++ b/contrib/tools/python3/src/Modules/posixmodule.c
@@ -2365,21 +2365,26 @@ _posix_free(void *module)
_posix_clear((PyObject *)module);
}
-static void
+static int
fill_time(PyObject *module, PyObject *v, int index, time_t sec, unsigned long nsec)
{
- PyObject *s = _PyLong_FromTime_t(sec);
- PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec);
+ assert(!PyErr_Occurred());
+
+ int res = -1;
PyObject *s_in_ns = NULL;
PyObject *ns_total = NULL;
PyObject *float_s = NULL;
- if (!(s && ns_fractional))
+ PyObject *s = _PyLong_FromTime_t(sec);
+ PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec);
+ if (!(s && ns_fractional)) {
goto exit;
+ }
s_in_ns = PyNumber_Multiply(s, get_posix_state(module)->billion);
- if (!s_in_ns)
+ if (!s_in_ns) {
goto exit;
+ }
ns_total = PyNumber_Add(s_in_ns, ns_fractional);
if (!ns_total)
@@ -2396,12 +2401,17 @@ fill_time(PyObject *module, PyObject *v, int index, time_t sec, unsigned long ns
s = NULL;
float_s = NULL;
ns_total = NULL;
+
+ assert(!PyErr_Occurred());
+ res = 0;
+
exit:
Py_XDECREF(s);
Py_XDECREF(ns_fractional);
Py_XDECREF(s_in_ns);
Py_XDECREF(ns_total);
Py_XDECREF(float_s);
+ return res;
}
/* pack a system stat C structure into the Python stat tuple
@@ -2409,33 +2419,46 @@ exit:
static PyObject*
_pystat_fromstructstat(PyObject *module, STRUCT_STAT *st)
{
- unsigned long ansec, mnsec, cnsec;
+ assert(!PyErr_Occurred());
+
PyObject *StatResultType = get_posix_state(module)->StatResultType;
PyObject *v = PyStructSequence_New((PyTypeObject *)StatResultType);
- if (v == NULL)
+ if (v == NULL) {
return NULL;
+ }
+
+#define SET_ITEM(pos, expr) \
+ do { \
+ PyObject *obj = (expr); \
+ if (obj == NULL) { \
+ goto error; \
+ } \
+ PyStructSequence_SET_ITEM(v, (pos), obj); \
+ } while (0)
- PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode));
+ SET_ITEM(0, PyLong_FromLong((long)st->st_mode));
static_assert(sizeof(unsigned long long) >= sizeof(st->st_ino),
"stat.st_ino is larger than unsigned long long");
- PyStructSequence_SET_ITEM(v, 1, PyLong_FromUnsignedLongLong(st->st_ino));
+ SET_ITEM(1, PyLong_FromUnsignedLongLong(st->st_ino));
#ifdef MS_WINDOWS
- PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev));
+ SET_ITEM(2, PyLong_FromUnsignedLong(st->st_dev));
#else
- PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev));
+ SET_ITEM(2, _PyLong_FromDev(st->st_dev));
#endif
- PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
+ SET_ITEM(3, PyLong_FromLong((long)st->st_nlink));
#if defined(MS_WINDOWS)
- PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong(0));
- PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong(0));
+ SET_ITEM(4, PyLong_FromLong(0));
+ SET_ITEM(5, PyLong_FromLong(0));
#else
- PyStructSequence_SET_ITEM(v, 4, _PyLong_FromUid(st->st_uid));
- PyStructSequence_SET_ITEM(v, 5, _PyLong_FromGid(st->st_gid));
+ SET_ITEM(4, _PyLong_FromUid(st->st_uid));
+ SET_ITEM(5, _PyLong_FromGid(st->st_gid));
#endif
static_assert(sizeof(long long) >= sizeof(st->st_size),
"stat.st_size is larger than long long");
- PyStructSequence_SET_ITEM(v, 6, PyLong_FromLongLong(st->st_size));
+ SET_ITEM(6, PyLong_FromLongLong(st->st_size));
+ // Set st_atime, st_mtime and st_ctime
+ unsigned long ansec, mnsec, cnsec;
#if defined(HAVE_STAT_TV_NSEC)
ansec = st->st_atim.tv_nsec;
mnsec = st->st_mtim.tv_nsec;
@@ -2451,64 +2474,62 @@ _pystat_fromstructstat(PyObject *module, STRUCT_STAT *st)
#else
ansec = mnsec = cnsec = 0;
#endif
- fill_time(module, v, 7, st->st_atime, ansec);
- fill_time(module, v, 8, st->st_mtime, mnsec);
- fill_time(module, v, 9, st->st_ctime, cnsec);
+ if (fill_time(module, v, 7, st->st_atime, ansec) < 0) {
+ goto error;
+ }
+ if (fill_time(module, v, 8, st->st_mtime, mnsec) < 0) {
+ goto error;
+ }
+ if (fill_time(module, v, 9, st->st_ctime, cnsec) < 0) {
+ goto error;
+ }
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
- PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX,
- PyLong_FromLong((long)st->st_blksize));
+ SET_ITEM(ST_BLKSIZE_IDX, PyLong_FromLong((long)st->st_blksize));
#endif
#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
- PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX,
- PyLong_FromLong((long)st->st_blocks));
+ SET_ITEM(ST_BLOCKS_IDX, PyLong_FromLong((long)st->st_blocks));
#endif
#ifdef HAVE_STRUCT_STAT_ST_RDEV
- PyStructSequence_SET_ITEM(v, ST_RDEV_IDX,
- PyLong_FromLong((long)st->st_rdev));
+ SET_ITEM(ST_RDEV_IDX, PyLong_FromLong((long)st->st_rdev));
#endif
#ifdef HAVE_STRUCT_STAT_ST_GEN
- PyStructSequence_SET_ITEM(v, ST_GEN_IDX,
- PyLong_FromLong((long)st->st_gen));
+ SET_ITEM(ST_GEN_IDX, PyLong_FromLong((long)st->st_gen));
#endif
#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
{
- PyObject *val;
- unsigned long bsec,bnsec;
+ unsigned long bsec, bnsec;
bsec = (long)st->st_birthtime;
#ifdef HAVE_STAT_TV_NSEC2
bnsec = st->st_birthtimespec.tv_nsec;
#else
bnsec = 0;
#endif
- val = PyFloat_FromDouble(bsec + 1e-9*bnsec);
- PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX,
- val);
+ SET_ITEM(ST_BIRTHTIME_IDX, PyFloat_FromDouble(bsec + bnsec * 1e-9));
}
#endif
#ifdef HAVE_STRUCT_STAT_ST_FLAGS
- PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX,
- PyLong_FromLong((long)st->st_flags));
+ SET_ITEM(ST_FLAGS_IDX, PyLong_FromLong((long)st->st_flags));
#endif
#ifdef HAVE_STRUCT_STAT_ST_FILE_ATTRIBUTES
- PyStructSequence_SET_ITEM(v, ST_FILE_ATTRIBUTES_IDX,
- PyLong_FromUnsignedLong(st->st_file_attributes));
+ SET_ITEM(ST_FILE_ATTRIBUTES_IDX,
+ PyLong_FromUnsignedLong(st->st_file_attributes));
#endif
#ifdef HAVE_STRUCT_STAT_ST_FSTYPE
- PyStructSequence_SET_ITEM(v, ST_FSTYPE_IDX,
- PyUnicode_FromString(st->st_fstype));
+ SET_ITEM(ST_FSTYPE_IDX, PyUnicode_FromString(st->st_fstype));
#endif
#ifdef HAVE_STRUCT_STAT_ST_REPARSE_TAG
- PyStructSequence_SET_ITEM(v, ST_REPARSE_TAG_IDX,
- PyLong_FromUnsignedLong(st->st_reparse_tag));
+ SET_ITEM(ST_REPARSE_TAG_IDX, PyLong_FromUnsignedLong(st->st_reparse_tag));
#endif
- if (PyErr_Occurred()) {
- Py_DECREF(v);
- return NULL;
- }
-
+ assert(!PyErr_Occurred());
return v;
+
+error:
+ Py_DECREF(v);
+ return NULL;
+
+#undef SET_ITEM
}
/* POSIX methods */
@@ -3812,9 +3833,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);
@@ -3862,8 +3884,9 @@ posix_getcwd(int use_bytes)
return PyErr_NoMemory();
}
if (cwd == NULL) {
+ posix_error();
PyMem_RawFree(buf);
- return posix_error();
+ return NULL;
}
PyObject *obj;
@@ -4075,8 +4098,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 {
@@ -4089,14 +4112,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);
@@ -4107,8 +4128,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);
@@ -4117,8 +4138,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);
}
}
}
@@ -4180,7 +4201,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
@@ -4202,8 +4224,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;
}
}
@@ -5881,8 +5903,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;
}
@@ -6179,11 +6202,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: {
@@ -6580,12 +6604,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]
@@ -6799,6 +6826,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();
@@ -6806,8 +6834,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 */
@@ -6838,6 +6868,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();
@@ -6845,8 +6876,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 */
@@ -7387,13 +7420,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;
}
@@ -7746,8 +7783,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);
@@ -8319,8 +8357,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;
@@ -9716,10 +9755,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;
}
@@ -9768,8 +9810,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);
@@ -9866,9 +9911,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;
@@ -10037,24 +10084,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;
@@ -10371,10 +10420,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 */
@@ -10509,13 +10558,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;
}
@@ -11077,12 +11126,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;
}
@@ -12924,10 +12974,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;
}
@@ -13693,14 +13745,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);
}
@@ -13896,17 +13952,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;
@@ -14473,12 +14534,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/contrib/tools/python3/src/Modules/selectmodule.c b/contrib/tools/python3/src/Modules/selectmodule.c
index 4eea928a26..8210269867 100644
--- a/contrib/tools/python3/src/Modules/selectmodule.c
+++ b/contrib/tools/python3/src/Modules/selectmodule.c
@@ -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;
}
diff --git a/contrib/tools/python3/src/Modules/socketmodule.c b/contrib/tools/python3/src/Modules/socketmodule.c
index 4424ea367b..da18bf9666 100644
--- a/contrib/tools/python3/src/Modules/socketmodule.c
+++ b/contrib/tools/python3/src/Modules/socketmodule.c
@@ -5358,8 +5358,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;
}
}
@@ -5502,8 +5502,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);
@@ -6090,8 +6091,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
@@ -6535,11 +6536,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);
}
}
@@ -6869,8 +6871,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/contrib/tools/python3/src/Modules/ya.make b/contrib/tools/python3/src/Modules/ya.make
index 833218bf9e..0301557e23 100644
--- a/contrib/tools/python3/src/Modules/ya.make
+++ b/contrib/tools/python3/src/Modules/ya.make
@@ -2,9 +2,9 @@
LIBRARY()
-VERSION(3.11.5)
+VERSION(3.11.6)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.11.5.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.11.6.tar.gz)
LICENSE(Python-2.0)