summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Modules
diff options
context:
space:
mode:
authorshadchin <[email protected]>2025-06-13 00:05:26 +0300
committershadchin <[email protected]>2025-06-13 00:35:30 +0300
commit796b9088366b10b4cd42885101fc20c0b5709b07 (patch)
treef287eacb0b95ffd7cabf95b16cafb4788645dc38 /contrib/tools/python3/Modules
parentc72bca862651e507d2ff4980ef7f4ff7267a7227 (diff)
Update Python 3 to 3.12.10
commit_hash:dd2398e159fe1d72ea6b12da52fccc933a41a785
Diffstat (limited to 'contrib/tools/python3/Modules')
-rw-r--r--contrib/tools/python3/Modules/_ctypes/_ctypes.c6
-rw-r--r--contrib/tools/python3/Modules/_datetimemodule.c101
-rw-r--r--contrib/tools/python3/Modules/_elementtree.c122
-rw-r--r--contrib/tools/python3/Modules/_hashopenssl.c293
-rw-r--r--contrib/tools/python3/Modules/_io/winconsoleio.c2
-rw-r--r--contrib/tools/python3/Modules/_pickle.c12
-rw-r--r--contrib/tools/python3/Modules/_sqlite/row.c25
-rw-r--r--contrib/tools/python3/Modules/_sqlite/ya.make4
-rw-r--r--contrib/tools/python3/Modules/_ssl.c6
-rw-r--r--contrib/tools/python3/Modules/_ssl/debughelpers.c7
-rw-r--r--contrib/tools/python3/Modules/_threadmodule.c12
-rw-r--r--contrib/tools/python3/Modules/faulthandler.c45
-rw-r--r--contrib/tools/python3/Modules/gcmodule.c30
-rw-r--r--contrib/tools/python3/Modules/md5module.c9
-rw-r--r--contrib/tools/python3/Modules/sha1module.c9
-rw-r--r--contrib/tools/python3/Modules/socketmodule.c73
-rw-r--r--contrib/tools/python3/Modules/syslogmodule.c35
17 files changed, 488 insertions, 303 deletions
diff --git a/contrib/tools/python3/Modules/_ctypes/_ctypes.c b/contrib/tools/python3/Modules/_ctypes/_ctypes.c
index 96a05755496..d3b496887b5 100644
--- a/contrib/tools/python3/Modules/_ctypes/_ctypes.c
+++ b/contrib/tools/python3/Modules/_ctypes/_ctypes.c
@@ -2826,6 +2826,7 @@ PyCData_NewGetBuffer(PyObject *myself, Py_buffer *view, int flags)
StgDictObject *item_dict = PyType_stgdict(item_type);
if (view == NULL) return 0;
+ assert(dict);
view->buf = self->b_ptr;
view->obj = Py_NewRef(myself);
@@ -2862,7 +2863,10 @@ PyCData_reduce(PyObject *myself, PyObject *args)
{
CDataObject *self = (CDataObject *)myself;
- if (PyObject_stgdict(myself)->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) {
+ StgDictObject *stgdict = PyObject_stgdict(myself);
+ assert(stgdict);
+
+ if (stgdict->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) {
PyErr_SetString(PyExc_ValueError,
"ctypes objects containing pointers cannot be pickled");
return NULL;
diff --git a/contrib/tools/python3/Modules/_datetimemodule.c b/contrib/tools/python3/Modules/_datetimemodule.c
index 8535811a61b..eb144cfdecf 100644
--- a/contrib/tools/python3/Modules/_datetimemodule.c
+++ b/contrib/tools/python3/Modules/_datetimemodule.c
@@ -1028,6 +1028,40 @@ new_datetime_ex(int year, int month, int day, int hour, int minute,
&PyDateTime_DateTimeType)
static PyObject *
+call_subclass_fold(PyObject *cls, int fold, const char *format, ...)
+{
+ PyObject *kwargs = NULL, *res = NULL;
+ va_list va;
+
+ va_start(va, format);
+ PyObject *args = Py_VaBuildValue(format, va);
+ va_end(va);
+ if (args == NULL) {
+ return NULL;
+ }
+ if (fold) {
+ kwargs = PyDict_New();
+ if (kwargs == NULL) {
+ goto Done;
+ }
+ PyObject *obj = PyLong_FromLong(fold);
+ if (obj == NULL) {
+ goto Done;
+ }
+ int err = PyDict_SetItemString(kwargs, "fold", obj);
+ Py_DECREF(obj);
+ if (err < 0) {
+ goto Done;
+ }
+ }
+ res = PyObject_Call(cls, args, kwargs);
+Done:
+ Py_DECREF(args);
+ Py_XDECREF(kwargs);
+ return res;
+}
+
+static PyObject *
new_datetime_subclass_fold_ex(int year, int month, int day, int hour, int minute,
int second, int usecond, PyObject *tzinfo,
int fold, PyObject *cls) {
@@ -1036,17 +1070,11 @@ new_datetime_subclass_fold_ex(int year, int month, int day, int hour, int minute
// Use the fast path constructor
dt = new_datetime(year, month, day, hour, minute, second, usecond,
tzinfo, fold);
- } else {
+ }
+ else {
// Subclass
- dt = PyObject_CallFunction(cls, "iiiiiiiO",
- year,
- month,
- day,
- hour,
- minute,
- second,
- usecond,
- tzinfo);
+ dt = call_subclass_fold(cls, fold, "iiiiiiiO", year, month, day,
+ hour, minute, second, usecond, tzinfo);
}
return dt;
@@ -1102,6 +1130,24 @@ new_time_ex(int hour, int minute, int second, int usecond,
#define new_time(hh, mm, ss, us, tzinfo, fold) \
new_time_ex2(hh, mm, ss, us, tzinfo, fold, &PyDateTime_TimeType)
+static PyObject *
+new_time_subclass_fold_ex(int hour, int minute, int second, int usecond,
+ PyObject *tzinfo, int fold, PyObject *cls)
+{
+ PyObject *t;
+ if ((PyTypeObject*)cls == &PyDateTime_TimeType) {
+ // Use the fast path constructor
+ t = new_time(hour, minute, second, usecond, tzinfo, fold);
+ }
+ else {
+ // Subclass
+ t = call_subclass_fold(cls, fold, "iiiiO", hour, minute, second,
+ usecond, tzinfo);
+ }
+
+ return t;
+}
+
/* Create a timedelta instance. Normalize the members iff normalize is
* true. Passing false is a speed optimization, if you know for sure
* that seconds and microseconds are already in their proper ranges. In any
@@ -3430,8 +3476,6 @@ date_timetuple(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored))
static PyObject *
date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)
{
- PyObject *clone;
- PyObject *tuple;
int year = GET_YEAR(self);
int month = GET_MONTH(self);
int day = GET_DAY(self);
@@ -3439,12 +3483,7 @@ date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)
if (! PyArg_ParseTupleAndKeywords(args, kw, "|iii:replace", date_kws,
&year, &month, &day))
return NULL;
- tuple = Py_BuildValue("iii", year, month, day);
- if (tuple == NULL)
- return NULL;
- clone = date_new(Py_TYPE(self), tuple, NULL);
- Py_DECREF(tuple);
- return clone;
+ return new_date_subclass_ex(year, month, day, (PyObject *)Py_TYPE(self));
}
static Py_hash_t
@@ -4533,8 +4572,6 @@ time_hash(PyDateTime_Time *self)
static PyObject *
time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw)
{
- PyObject *clone;
- PyObject *tuple;
int hh = TIME_GET_HOUR(self);
int mm = TIME_GET_MINUTE(self);
int ss = TIME_GET_SECOND(self);
@@ -4551,15 +4588,8 @@ time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw)
"fold must be either 0 or 1");
return NULL;
}
- tuple = Py_BuildValue("iiiiO", hh, mm, ss, us, tzinfo);
- if (tuple == NULL)
- return NULL;
- clone = time_new(Py_TYPE(self), tuple, NULL);
- if (clone != NULL) {
- TIME_SET_FOLD(clone, fold);
- }
- Py_DECREF(tuple);
- return clone;
+ return new_time_subclass_fold_ex(hh, mm, ss, us, tzinfo, fold,
+ (PyObject *)Py_TYPE(self));
}
static PyObject *
@@ -6003,8 +6033,6 @@ datetime_hash(PyDateTime_DateTime *self)
static PyObject *
datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
{
- PyObject *clone;
- PyObject *tuple;
int y = GET_YEAR(self);
int m = GET_MONTH(self);
int d = GET_DAY(self);
@@ -6025,15 +6053,8 @@ datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
"fold must be either 0 or 1");
return NULL;
}
- tuple = Py_BuildValue("iiiiiiiO", y, m, d, hh, mm, ss, us, tzinfo);
- if (tuple == NULL)
- return NULL;
- clone = datetime_new(Py_TYPE(self), tuple, NULL);
- if (clone != NULL) {
- DATE_SET_FOLD(clone, fold);
- }
- Py_DECREF(tuple);
- return clone;
+ return new_datetime_subclass_fold_ex(y, m, d, hh, mm, ss, us, tzinfo, fold,
+ (PyObject *)Py_TYPE(self));
}
static PyObject *
diff --git a/contrib/tools/python3/Modules/_elementtree.c b/contrib/tools/python3/Modules/_elementtree.c
index 386f38add16..56d1508af13 100644
--- a/contrib/tools/python3/Modules/_elementtree.c
+++ b/contrib/tools/python3/Modules/_elementtree.c
@@ -845,6 +845,7 @@ _elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo)
if (element_resize(element, self->extra->length) < 0)
goto error;
+ // TODO(picnixz): check for an evil child's __deepcopy__ on 'self'
for (i = 0; i < self->extra->length; i++) {
PyObject* child = deepcopy(st, self->extra->children[i], memo);
if (!child || !Element_Check(st, child)) {
@@ -1249,29 +1250,28 @@ _elementtree_Element_find_impl(ElementObject *self, PyTypeObject *cls,
PyObject *path, PyObject *namespaces)
/*[clinic end generated code: output=18f77d393c9fef1b input=94df8a83f956acc6]*/
{
- Py_ssize_t i;
elementtreestate *st = get_elementtree_state_by_cls(cls);
if (checkpath(path) || namespaces != Py_None) {
return PyObject_CallMethodObjArgs(
st->elementpath_obj, st->str_find, self, path, namespaces, NULL
- );
+ );
}
- if (!self->extra)
- Py_RETURN_NONE;
-
- for (i = 0; i < self->extra->length; i++) {
- PyObject* item = self->extra->children[i];
- int rc;
+ for (Py_ssize_t i = 0; self->extra && i < self->extra->length; i++) {
+ PyObject *item = self->extra->children[i];
assert(Element_Check(st, item));
Py_INCREF(item);
- rc = PyObject_RichCompareBool(((ElementObject*)item)->tag, path, Py_EQ);
- if (rc > 0)
+ PyObject *tag = Py_NewRef(((ElementObject *)item)->tag);
+ int rc = PyObject_RichCompareBool(tag, path, Py_EQ);
+ Py_DECREF(tag);
+ if (rc > 0) {
return item;
+ }
Py_DECREF(item);
- if (rc < 0)
+ if (rc < 0) {
return NULL;
+ }
}
Py_RETURN_NONE;
@@ -1294,38 +1294,34 @@ _elementtree_Element_findtext_impl(ElementObject *self, PyTypeObject *cls,
PyObject *namespaces)
/*[clinic end generated code: output=6af7a2d96aac32cb input=32f252099f62a3d2]*/
{
- Py_ssize_t i;
elementtreestate *st = get_elementtree_state_by_cls(cls);
if (checkpath(path) || namespaces != Py_None)
return PyObject_CallMethodObjArgs(
st->elementpath_obj, st->str_findtext,
self, path, default_value, namespaces, NULL
- );
-
- if (!self->extra) {
- return Py_NewRef(default_value);
- }
+ );
- for (i = 0; i < self->extra->length; i++) {
+ for (Py_ssize_t i = 0; self->extra && i < self->extra->length; i++) {
PyObject *item = self->extra->children[i];
- int rc;
assert(Element_Check(st, item));
Py_INCREF(item);
- rc = PyObject_RichCompareBool(((ElementObject*)item)->tag, path, Py_EQ);
+ PyObject *tag = Py_NewRef(((ElementObject *)item)->tag);
+ int rc = PyObject_RichCompareBool(tag, path, Py_EQ);
+ Py_DECREF(tag);
if (rc > 0) {
- PyObject* text = element_get_text((ElementObject*)item);
+ PyObject *text = element_get_text((ElementObject *)item);
+ Py_DECREF(item);
if (text == Py_None) {
- Py_DECREF(item);
return PyUnicode_New(0, 0);
}
Py_XINCREF(text);
- Py_DECREF(item);
return text;
}
Py_DECREF(item);
- if (rc < 0)
+ if (rc < 0) {
return NULL;
+ }
}
return Py_NewRef(default_value);
@@ -1346,29 +1342,26 @@ _elementtree_Element_findall_impl(ElementObject *self, PyTypeObject *cls,
PyObject *path, PyObject *namespaces)
/*[clinic end generated code: output=65e39a1208f3b59e input=7aa0db45673fc9a5]*/
{
- Py_ssize_t i;
- PyObject* out;
elementtreestate *st = get_elementtree_state_by_cls(cls);
if (checkpath(path) || namespaces != Py_None) {
return PyObject_CallMethodObjArgs(
st->elementpath_obj, st->str_findall, self, path, namespaces, NULL
- );
+ );
}
- out = PyList_New(0);
- if (!out)
+ PyObject *out = PyList_New(0);
+ if (out == NULL) {
return NULL;
+ }
- if (!self->extra)
- return out;
-
- for (i = 0; i < self->extra->length; i++) {
- PyObject* item = self->extra->children[i];
- int rc;
+ for (Py_ssize_t i = 0; self->extra && i < self->extra->length; i++) {
+ PyObject *item = self->extra->children[i];
assert(Element_Check(st, item));
Py_INCREF(item);
- rc = PyObject_RichCompareBool(((ElementObject*)item)->tag, path, Py_EQ);
+ PyObject *tag = Py_NewRef(((ElementObject *)item)->tag);
+ int rc = PyObject_RichCompareBool(tag, path, Py_EQ);
+ Py_DECREF(tag);
if (rc != 0 && (rc < 0 || PyList_Append(out, item) < 0)) {
Py_DECREF(item);
Py_DECREF(out);
@@ -1635,42 +1628,47 @@ _elementtree_Element_remove_impl(ElementObject *self, PyObject *subelement)
/*[clinic end generated code: output=38fe6c07d6d87d1f input=6133e1d05597d5ee]*/
{
Py_ssize_t i;
- int rc;
- PyObject *found;
-
- if (!self->extra) {
- /* element has no children, so raise exception */
- PyErr_SetString(
- PyExc_ValueError,
- "list.remove(x): x not in list"
- );
- return NULL;
- }
-
- for (i = 0; i < self->extra->length; i++) {
- if (self->extra->children[i] == subelement)
+ // When iterating over the list of children, we need to check that the
+ // list is not cleared (self->extra != NULL) and that we are still within
+ // the correct bounds (i < self->extra->length).
+ //
+ // We deliberately avoid protecting against children lists that grow
+ // faster than the index since list objects do not protect against it.
+ int rc = 0;
+ for (i = 0; self->extra && i < self->extra->length; i++) {
+ if (self->extra->children[i] == subelement) {
+ rc = 1;
break;
- rc = PyObject_RichCompareBool(self->extra->children[i], subelement, Py_EQ);
- if (rc > 0)
- break;
- if (rc < 0)
+ }
+ PyObject *child = Py_NewRef(self->extra->children[i]);
+ rc = PyObject_RichCompareBool(child, subelement, Py_EQ);
+ Py_DECREF(child);
+ if (rc < 0) {
return NULL;
+ }
+ else if (rc > 0) {
+ break;
+ }
}
- if (i >= self->extra->length) {
- /* subelement is not in children, so raise exception */
- PyErr_SetString(
- PyExc_ValueError,
- "list.remove(x): x not in list"
- );
+ if (rc == 0) {
+ PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
return NULL;
}
- found = self->extra->children[i];
+ // An extra check must be done if the mutation occurs at the very last
+ // step and removes or clears the 'extra' list (the condition on the
+ // length would not be satisfied any more).
+ if (self->extra == NULL || i >= self->extra->length) {
+ Py_RETURN_NONE;
+ }
+
+ PyObject *found = self->extra->children[i];
self->extra->length--;
- for (; i < self->extra->length; i++)
+ for (; i < self->extra->length; i++) {
self->extra->children[i] = self->extra->children[i+1];
+ }
Py_DECREF(found);
Py_RETURN_NONE;
diff --git a/contrib/tools/python3/Modules/_hashopenssl.c b/contrib/tools/python3/Modules/_hashopenssl.c
index 3cc7d6f50e8..41ec16426b0 100644
--- a/contrib/tools/python3/Modules/_hashopenssl.c
+++ b/contrib/tools/python3/Modules/_hashopenssl.c
@@ -300,30 +300,17 @@ class _hashlib.HMAC "HMACobject *" "((_hashlibstate *)PyModule_GetState(module))
/* LCOV_EXCL_START */
-static PyObject *
-_setException(PyObject *exc, const char* altmsg, ...)
-{
- unsigned long errcode = ERR_peek_last_error();
- const char *lib, *func, *reason;
- va_list vargs;
- va_start(vargs, altmsg);
- if (!errcode) {
- if (altmsg == NULL) {
- PyErr_SetString(exc, "no reason supplied");
- } else {
- PyErr_FormatV(exc, altmsg, vargs);
- }
- va_end(vargs);
- return NULL;
- }
- va_end(vargs);
- ERR_clear_error();
+/* Set an exception of given type using the given OpenSSL error code. */
+static void
+set_ssl_exception_from_errcode(PyObject *exc, unsigned long errcode)
+{
+ assert(errcode != 0);
/* ERR_ERROR_STRING(3) ensures that the messages below are ASCII */
- lib = ERR_lib_error_string(errcode);
- func = ERR_func_error_string(errcode);
- reason = ERR_reason_error_string(errcode);
+ const char *lib = ERR_lib_error_string(errcode);
+ const char *func = ERR_func_error_string(errcode);
+ const char *reason = ERR_reason_error_string(errcode);
if (lib && func) {
PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
@@ -334,13 +321,49 @@ _setException(PyObject *exc, const char* altmsg, ...)
else {
PyErr_SetString(exc, reason);
}
- return NULL;
+}
+
+/*
+ * Set an exception of given type.
+ *
+ * By default, the exception's message is constructed by using the last SSL
+ * error that occurred. If no error occurred, the 'fallback_format' is used
+ * to create a C-style formatted fallback message.
+ */
+static void
+raise_ssl_error(PyObject *exc, const char *fallback_format, ...)
+{
+ assert(fallback_format != NULL);
+ unsigned long errcode = ERR_peek_last_error();
+ if (errcode) {
+ ERR_clear_error();
+ set_ssl_exception_from_errcode(exc, errcode);
+ }
+ else {
+ va_list vargs;
+ va_start(vargs, fallback_format);
+ PyErr_FormatV(exc, fallback_format, vargs);
+ va_end(vargs);
+ }
+}
+
+/*
+ * Set an exception with a generic default message after an error occurred.
+ *
+ * It can also be used without previous calls to SSL built-in functions,
+ * in which case a generic error message is provided.
+ */
+static inline void
+notify_ssl_error_occurred(void)
+{
+ raise_ssl_error(PyExc_ValueError, "no reason supplied");
}
/* LCOV_EXCL_STOP */
static PyObject*
py_digest_name(const EVP_MD *md)
{
+ assert(md != NULL);
int nid = EVP_MD_nid(md);
const char *name = NULL;
const py_hashentry_t *h;
@@ -409,7 +432,8 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
}
}
if (digest == NULL) {
- _setException(state->unsupported_digestmod_error, "unsupported hash type %s", name);
+ raise_ssl_error(state->unsupported_digestmod_error,
+ "unsupported hash type %s", name);
return NULL;
}
return digest;
@@ -424,7 +448,6 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
*/
static PY_EVP_MD*
py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type py_ht) {
- PY_EVP_MD* evp;
PyObject *name_obj = NULL;
const char *name;
@@ -450,12 +473,7 @@ py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type
return NULL;
}
- evp = py_digest_by_name(module, name, py_ht);
- if (evp == NULL) {
- return NULL;
- }
-
- return evp;
+ return py_digest_by_name(module, name, py_ht);
}
static EVPobject *
@@ -489,7 +507,7 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
else
process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int);
if (!EVP_DigestUpdate(self->ctx, (const void*)cp, process)) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
return -1;
}
len -= process;
@@ -540,7 +558,8 @@ EVP_copy_impl(EVPobject *self)
if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) {
Py_DECREF(newobj);
- return _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
+ return NULL;
}
return (PyObject *)newobj;
}
@@ -567,17 +586,21 @@ EVP_digest_impl(EVPobject *self)
}
if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
- return _setException(PyExc_ValueError, NULL);
+ goto error;
}
digest_size = EVP_MD_CTX_size(temp_ctx);
if (!EVP_DigestFinal(temp_ctx, digest, NULL)) {
- _setException(PyExc_ValueError, NULL);
- return NULL;
+ goto error;
}
retval = PyBytes_FromStringAndSize((const char *)digest, digest_size);
EVP_MD_CTX_free(temp_ctx);
return retval;
+
+error:
+ EVP_MD_CTX_free(temp_ctx);
+ notify_ssl_error_occurred();
+ return NULL;
}
/*[clinic input]
@@ -602,17 +625,21 @@ EVP_hexdigest_impl(EVPobject *self)
/* Get the raw (binary) digest value */
if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
- return _setException(PyExc_ValueError, NULL);
+ goto error;
}
digest_size = EVP_MD_CTX_size(temp_ctx);
if (!EVP_DigestFinal(temp_ctx, digest, NULL)) {
- _setException(PyExc_ValueError, NULL);
- return NULL;
+ goto error;
}
EVP_MD_CTX_free(temp_ctx);
return _Py_strhex((const char *)digest, (Py_ssize_t)digest_size);
+
+error:
+ EVP_MD_CTX_free(temp_ctx);
+ notify_ssl_error_occurred();
+ return NULL;
}
/*[clinic input]
@@ -682,7 +709,12 @@ EVP_get_digest_size(EVPobject *self, void *closure)
static PyObject *
EVP_get_name(EVPobject *self, void *closure)
{
- return py_digest_name(EVP_MD_CTX_md(self->ctx));
+ const EVP_MD *md = EVP_MD_CTX_md(self->ctx);
+ if (md == NULL) {
+ notify_ssl_error_occurred();
+ return NULL;
+ }
+ return py_digest_name(md);
}
static PyGetSetDef EVP_getseters[] = {
@@ -780,21 +812,23 @@ EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length)
}
if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
- Py_DECREF(retval);
- EVP_MD_CTX_free(temp_ctx);
- return _setException(PyExc_ValueError, NULL);
+ goto error;
}
if (!EVP_DigestFinalXOF(temp_ctx,
(unsigned char*)PyBytes_AS_STRING(retval),
- length)) {
- Py_DECREF(retval);
- EVP_MD_CTX_free(temp_ctx);
- _setException(PyExc_ValueError, NULL);
- return NULL;
+ length))
+ {
+ goto error;
}
EVP_MD_CTX_free(temp_ctx);
return retval;
+
+error:
+ Py_DECREF(retval);
+ EVP_MD_CTX_free(temp_ctx);
+ notify_ssl_error_occurred();
+ return NULL;
}
/*[clinic input]
@@ -828,15 +862,10 @@ EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length)
/* Get the raw (binary) digest value */
if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
- PyMem_Free(digest);
- EVP_MD_CTX_free(temp_ctx);
- return _setException(PyExc_ValueError, NULL);
+ goto error;
}
if (!EVP_DigestFinalXOF(temp_ctx, digest, length)) {
- PyMem_Free(digest);
- EVP_MD_CTX_free(temp_ctx);
- _setException(PyExc_ValueError, NULL);
- return NULL;
+ goto error;
}
EVP_MD_CTX_free(temp_ctx);
@@ -844,6 +873,12 @@ EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length)
retval = _Py_strhex((const char *)digest, length);
PyMem_Free(digest);
return retval;
+
+error:
+ PyMem_Free(digest);
+ EVP_MD_CTX_free(temp_ctx);
+ notify_ssl_error_occurred();
+ return NULL;
}
static PyMethodDef EVPXOF_methods[] = {
@@ -944,7 +979,7 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
int result = EVP_DigestInit_ex(self->ctx, digest, NULL);
if (!result) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
Py_CLEAR(self);
goto exit;
}
@@ -960,12 +995,13 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
result = EVP_hash(self, view.buf, view.len);
}
if (result == -1) {
+ assert(PyErr_Occurred());
Py_CLEAR(self);
goto exit;
}
}
- exit:
+exit:
if (data_obj != NULL) {
PyBuffer_Release(&view);
}
@@ -1326,19 +1362,19 @@ pbkdf2_hmac_impl(PyObject *module, const char *hash_name,
key = PyBytes_AS_STRING(key_obj);
Py_BEGIN_ALLOW_THREADS
- retval = PKCS5_PBKDF2_HMAC((char*)password->buf, (int)password->len,
- (unsigned char *)salt->buf, (int)salt->len,
+ retval = PKCS5_PBKDF2_HMAC((const char *)password->buf, (int)password->len,
+ (const unsigned char *)salt->buf, (int)salt->len,
iterations, digest, dklen,
(unsigned char *)key);
Py_END_ALLOW_THREADS
if (!retval) {
Py_CLEAR(key_obj);
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
goto end;
}
- end:
+end:
if (digest != NULL) {
PY_EVP_MD_free(digest);
}
@@ -1410,14 +1446,14 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
r = PyLong_AsUnsignedLong(r_obj);
if (r == (unsigned long) -1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
- "r is required and must be an unsigned int");
+ "r is required and must be an unsigned int");
return NULL;
}
p = PyLong_AsUnsignedLong(p_obj);
if (p == (unsigned long) -1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
- "p is required and must be an unsigned int");
+ "p is required and must be an unsigned int");
return NULL;
}
@@ -1426,21 +1462,22 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
future. The maxmem constant is private to OpenSSL. */
PyErr_Format(PyExc_ValueError,
"maxmem must be positive and smaller than %d",
- INT_MAX);
+ INT_MAX);
return NULL;
}
if (dklen < 1 || dklen > INT_MAX) {
PyErr_Format(PyExc_ValueError,
- "dklen must be greater than 0 and smaller than %d",
- INT_MAX);
+ "dklen must be greater than 0 and smaller than %d",
+ INT_MAX);
return NULL;
}
/* let OpenSSL validate the rest */
retval = EVP_PBE_scrypt(NULL, 0, NULL, 0, n, r, p, maxmem, NULL, 0);
if (!retval) {
- _setException(PyExc_ValueError, "Invalid parameter combination for n, r, p, maxmem.");
+ raise_ssl_error(PyExc_ValueError,
+ "Invalid parameter combination for n, r, p, maxmem.");
return NULL;
}
@@ -1461,7 +1498,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
if (!retval) {
Py_CLEAR(key_obj);
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
return NULL;
}
return key_obj;
@@ -1510,15 +1547,15 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
Py_BEGIN_ALLOW_THREADS
result = HMAC(
evp,
- (const void*)key->buf, (int)key->len,
- (const unsigned char*)msg->buf, (int)msg->len,
+ (const void *)key->buf, (int)key->len,
+ (const unsigned char *)msg->buf, (size_t)msg->len,
md, &md_len
);
Py_END_ALLOW_THREADS
PY_EVP_MD_free(evp);
if (result == NULL) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
return NULL;
}
return PyBytes_FromStringAndSize((const char*)md, md_len);
@@ -1529,6 +1566,16 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
static int _hmac_update(HMACobject*, PyObject*);
+static const EVP_MD *
+_hashlib_hmac_get_md(HMACobject *self)
+{
+ const EVP_MD *md = HMAC_CTX_get_md(self->ctx);
+ if (md == NULL) {
+ raise_ssl_error(PyExc_ValueError, "missing EVP_MD for HMAC context");
+ }
+ return md;
+}
+
/*[clinic input]
_hashlib.hmac_new
@@ -1544,7 +1591,6 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
PyObject *digestmod)
/*[clinic end generated code: output=c20d9e4d9ed6d219 input=5f4071dcc7f34362]*/
{
- PyTypeObject *type = get_hashlib_state(module)->HMACtype;
PY_EVP_MD *digest;
HMAC_CTX *ctx = NULL;
HMACobject *self = NULL;
@@ -1557,8 +1603,8 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
}
if (digestmod == NULL) {
- PyErr_SetString(
- PyExc_TypeError, "Missing required parameter 'digestmod'.");
+ PyErr_SetString(PyExc_TypeError,
+ "Missing required parameter 'digestmod'.");
return NULL;
}
@@ -1569,40 +1615,38 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
ctx = HMAC_CTX_new();
if (ctx == NULL) {
- _setException(PyExc_ValueError, NULL);
+ PY_EVP_MD_free(digest);
+ PyErr_NoMemory();
goto error;
}
- r = HMAC_Init_ex(
- ctx,
- (const char*)key->buf,
- (int)key->len,
- digest,
- NULL /*impl*/);
+ r = HMAC_Init_ex(ctx, key->buf, (int)key->len, digest, NULL /* impl */);
PY_EVP_MD_free(digest);
if (r == 0) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
goto error;
}
- self = (HMACobject *)PyObject_New(HMACobject, type);
+ _hashlibstate *state = get_hashlib_state(module);
+ self = PyObject_New(HMACobject, state->HMACtype);
if (self == NULL) {
goto error;
}
self->ctx = ctx;
self->lock = NULL;
+ ctx = NULL; // 'ctx' is now owned by 'self'
if ((msg_obj != NULL) && (msg_obj != Py_None)) {
- if (!_hmac_update(self, msg_obj))
+ if (!_hmac_update(self, msg_obj)) {
goto error;
+ }
}
-
- return (PyObject*)self;
+ return (PyObject *)self;
error:
if (ctx) HMAC_CTX_free(ctx);
- if (self) PyObject_Free(self);
+ Py_XDECREF(self);
return NULL;
}
@@ -1617,11 +1661,19 @@ locked_HMAC_CTX_copy(HMAC_CTX *new_ctx_p, HMACobject *self)
return result;
}
+/* returning 0 means that an error occurred and an exception is set */
static unsigned int
-_hmac_digest_size(HMACobject *self)
+_hashlib_hmac_digest_size(HMACobject *self)
{
- unsigned int digest_size = EVP_MD_size(HMAC_CTX_get_md(self->ctx));
+ const EVP_MD *md = _hashlib_hmac_get_md(self);
+ if (md == NULL) {
+ return 0;
+ }
+ unsigned int digest_size = EVP_MD_size(md);
assert(digest_size <= EVP_MAX_MD_SIZE);
+ if (digest_size == 0) {
+ raise_ssl_error(PyExc_ValueError, "invalid digest size");
+ }
return digest_size;
}
@@ -1641,17 +1693,21 @@ _hmac_update(HMACobject *self, PyObject *obj)
if (self->lock != NULL) {
Py_BEGIN_ALLOW_THREADS
PyThread_acquire_lock(self->lock, 1);
- r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len);
+ r = HMAC_Update(self->ctx,
+ (const unsigned char*)view.buf,
+ (size_t)view.len);
PyThread_release_lock(self->lock);
Py_END_ALLOW_THREADS
} else {
- r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len);
+ r = HMAC_Update(self->ctx,
+ (const unsigned char *)view.buf,
+ (size_t)view.len);
}
PyBuffer_Release(&view);
if (r == 0) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
return 0;
}
return 1;
@@ -1671,14 +1727,15 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
HMAC_CTX *ctx = HMAC_CTX_new();
if (ctx == NULL) {
- return _setException(PyExc_ValueError, NULL);
+ return PyErr_NoMemory();
}
if (!locked_HMAC_CTX_copy(ctx, self)) {
HMAC_CTX_free(ctx);
- return _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
+ return NULL;
}
- retval = (HMACobject *)PyObject_New(HMACobject, Py_TYPE(self));
+ retval = PyObject_New(HMACobject, Py_TYPE(self));
if (retval == NULL) {
HMAC_CTX_free(ctx);
return NULL;
@@ -1696,7 +1753,10 @@ _hmac_dealloc(HMACobject *self)
if (self->lock != NULL) {
PyThread_free_lock(self->lock);
}
- HMAC_CTX_free(self->ctx);
+ if (self->ctx != NULL) {
+ HMAC_CTX_free(self->ctx);
+ self->ctx = NULL;
+ }
PyObject_Free(self);
Py_DECREF(tp);
}
@@ -1704,7 +1764,11 @@ _hmac_dealloc(HMACobject *self)
static PyObject *
_hmac_repr(HMACobject *self)
{
- PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx));
+ const EVP_MD *md = _hashlib_hmac_get_md(self);
+ if (md == NULL) {
+ return NULL;
+ }
+ PyObject *digest_name = py_digest_name(md);
if (digest_name == NULL) {
return NULL;
}
@@ -1737,17 +1801,18 @@ _hmac_digest(HMACobject *self, unsigned char *buf, unsigned int len)
{
HMAC_CTX *temp_ctx = HMAC_CTX_new();
if (temp_ctx == NULL) {
- PyErr_NoMemory();
+ (void)PyErr_NoMemory();
return 0;
}
if (!locked_HMAC_CTX_copy(temp_ctx, self)) {
- _setException(PyExc_ValueError, NULL);
+ HMAC_CTX_free(temp_ctx);
+ notify_ssl_error_occurred();
return 0;
}
int r = HMAC_Final(temp_ctx, buf, &len);
HMAC_CTX_free(temp_ctx);
if (r == 0) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
return 0;
}
return 1;
@@ -1763,9 +1828,9 @@ _hashlib_HMAC_digest_impl(HMACobject *self)
/*[clinic end generated code: output=1b1424355af7a41e input=bff07f74da318fb4]*/
{
unsigned char digest[EVP_MAX_MD_SIZE];
- unsigned int digest_size = _hmac_digest_size(self);
+ unsigned int digest_size = _hashlib_hmac_digest_size(self);
if (digest_size == 0) {
- return _setException(PyExc_ValueError, NULL);
+ return NULL;
}
int r = _hmac_digest(self, digest, digest_size);
if (r == 0) {
@@ -1788,9 +1853,9 @@ _hashlib_HMAC_hexdigest_impl(HMACobject *self)
/*[clinic end generated code: output=80d825be1eaae6a7 input=5abc42702874ddcf]*/
{
unsigned char digest[EVP_MAX_MD_SIZE];
- unsigned int digest_size = _hmac_digest_size(self);
+ unsigned int digest_size = _hashlib_hmac_digest_size(self);
if (digest_size == 0) {
- return _setException(PyExc_ValueError, NULL);
+ return NULL;
}
int r = _hmac_digest(self, digest, digest_size);
if (r == 0) {
@@ -1802,27 +1867,25 @@ _hashlib_HMAC_hexdigest_impl(HMACobject *self)
static PyObject *
_hashlib_hmac_get_digest_size(HMACobject *self, void *closure)
{
- unsigned int digest_size = _hmac_digest_size(self);
- if (digest_size == 0) {
- return _setException(PyExc_ValueError, NULL);
- }
- return PyLong_FromLong(digest_size);
+ unsigned int digest_size = _hashlib_hmac_digest_size(self);
+ return digest_size == 0 ? NULL : PyLong_FromLong(digest_size);
}
static PyObject *
_hashlib_hmac_get_block_size(HMACobject *self, void *closure)
{
- const EVP_MD *md = HMAC_CTX_get_md(self->ctx);
- if (md == NULL) {
- return _setException(PyExc_ValueError, NULL);
- }
- return PyLong_FromLong(EVP_MD_block_size(md));
+ const EVP_MD *md = _hashlib_hmac_get_md(self);
+ return md == NULL ? NULL : PyLong_FromLong(EVP_MD_block_size(md));
}
static PyObject *
_hashlib_hmac_get_name(HMACobject *self, void *closure)
{
- PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx));
+ const EVP_MD *md = _hashlib_hmac_get_md(self);
+ if (md == NULL) {
+ return NULL;
+ }
+ PyObject *digest_name = py_digest_name(md);
if (digest_name == NULL) {
return NULL;
}
@@ -1978,7 +2041,7 @@ _hashlib_get_fips_mode_impl(PyObject *module)
// But 0 is also a valid result value.
unsigned long errcode = ERR_peek_last_error();
if (errcode) {
- _setException(PyExc_ValueError, NULL);
+ notify_ssl_error_occurred();
return -1;
}
}
diff --git a/contrib/tools/python3/Modules/_io/winconsoleio.c b/contrib/tools/python3/Modules/_io/winconsoleio.c
index da4907ec2db..164789ef218 100644
--- a/contrib/tools/python3/Modules/_io/winconsoleio.c
+++ b/contrib/tools/python3/Modules/_io/winconsoleio.c
@@ -23,7 +23,7 @@
#include <stddef.h> /* For offsetof */
#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <fcntl.h>
diff --git a/contrib/tools/python3/Modules/_pickle.c b/contrib/tools/python3/Modules/_pickle.c
index b8f701c2af2..c4b59700d3e 100644
--- a/contrib/tools/python3/Modules/_pickle.c
+++ b/contrib/tools/python3/Modules/_pickle.c
@@ -13,6 +13,7 @@
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_runtime.h" // _Py_ID()
#include "pycore_pystate.h" // _PyThreadState_GET()
+#include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
#include "structmember.h" // PyMemberDef
#include <stdlib.h> // strtol()
@@ -1984,19 +1985,19 @@ whichmodule(PyObject *global, PyObject *dotted_path)
assert(module_name == NULL);
/* Fallback on walking sys.modules */
- PyThreadState *tstate = _PyThreadState_GET();
- modules = _PySys_GetAttr(tstate, &_Py_ID(modules));
+ modules = _PySys_GetRequiredAttr(&_Py_ID(modules));
if (modules == NULL) {
- PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
return NULL;
}
if (PyDict_CheckExact(modules)) {
i = 0;
while (PyDict_Next(modules, &i, &module_name, &module)) {
if (_checkmodule(module_name, module, global, dotted_path) == 0) {
+ Py_DECREF(modules);
return Py_NewRef(module_name);
}
if (PyErr_Occurred()) {
+ Py_DECREF(modules);
return NULL;
}
}
@@ -2004,6 +2005,7 @@ whichmodule(PyObject *global, PyObject *dotted_path)
else {
PyObject *iterator = PyObject_GetIter(modules);
if (iterator == NULL) {
+ Py_DECREF(modules);
return NULL;
}
while ((module_name = PyIter_Next(iterator))) {
@@ -2011,22 +2013,26 @@ whichmodule(PyObject *global, PyObject *dotted_path)
if (module == NULL) {
Py_DECREF(module_name);
Py_DECREF(iterator);
+ Py_DECREF(modules);
return NULL;
}
if (_checkmodule(module_name, module, global, dotted_path) == 0) {
Py_DECREF(module);
Py_DECREF(iterator);
+ Py_DECREF(modules);
return module_name;
}
Py_DECREF(module);
Py_DECREF(module_name);
if (PyErr_Occurred()) {
Py_DECREF(iterator);
+ Py_DECREF(modules);
return NULL;
}
}
Py_DECREF(iterator);
}
+ Py_DECREF(modules);
/* If no module is found, use __main__. */
module_name = &_Py_ID(__main__);
diff --git a/contrib/tools/python3/Modules/_sqlite/row.c b/contrib/tools/python3/Modules/_sqlite/row.c
index 1a1943285ce..6179e279678 100644
--- a/contrib/tools/python3/Modules/_sqlite/row.c
+++ b/contrib/tools/python3/Modules/_sqlite/row.c
@@ -128,7 +128,6 @@ static PyObject *
pysqlite_row_subscript(pysqlite_Row *self, PyObject *idx)
{
Py_ssize_t _idx;
- Py_ssize_t nitems, i;
if (PyLong_Check(idx)) {
_idx = PyNumber_AsSsize_t(idx, PyExc_IndexError);
@@ -140,9 +139,13 @@ pysqlite_row_subscript(pysqlite_Row *self, PyObject *idx)
PyObject *item = PyTuple_GetItem(self->data, _idx);
return Py_XNewRef(item);
} else if (PyUnicode_Check(idx)) {
- nitems = PyTuple_Size(self->description);
+ if (Py_IsNone(self->description)) {
+ PyErr_Format(PyExc_IndexError, "No item with key %R", idx);
+ return NULL;
+ }
+ Py_ssize_t nitems = PyTuple_GET_SIZE(self->description);
- for (i = 0; i < nitems; i++) {
+ for (Py_ssize_t i = 0; i < nitems; i++) {
PyObject *obj;
obj = PyTuple_GET_ITEM(self->description, i);
obj = PyTuple_GET_ITEM(obj, 0);
@@ -185,17 +188,19 @@ static PyObject *
pysqlite_row_keys_impl(pysqlite_Row *self)
/*[clinic end generated code: output=efe3dfb3af6edc07 input=7549a122827c5563]*/
{
- PyObject* list;
- Py_ssize_t nitems, i;
-
- list = PyList_New(0);
+ PyObject *list = PyList_New(0);
if (!list) {
return NULL;
}
- nitems = PyTuple_Size(self->description);
+ if (Py_IsNone(self->description)) {
+ return list;
+ }
- for (i = 0; i < nitems; i++) {
- if (PyList_Append(list, PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)) != 0) {
+ Py_ssize_t nitems = PyTuple_GET_SIZE(self->description);
+ for (Py_ssize_t i = 0; i < nitems; i++) {
+ PyObject *descr = PyTuple_GET_ITEM(self->description, i);
+ PyObject *name = PyTuple_GET_ITEM(descr, 0);
+ if (PyList_Append(list, name) < 0) {
Py_DECREF(list);
return NULL;
}
diff --git a/contrib/tools/python3/Modules/_sqlite/ya.make b/contrib/tools/python3/Modules/_sqlite/ya.make
index 7abcc1886ad..c795ae765ed 100644
--- a/contrib/tools/python3/Modules/_sqlite/ya.make
+++ b/contrib/tools/python3/Modules/_sqlite/ya.make
@@ -2,9 +2,9 @@
PY3_LIBRARY()
-VERSION(3.12.9)
+VERSION(3.12.10)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.9.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.10.tar.gz)
LICENSE(Python-2.0)
diff --git a/contrib/tools/python3/Modules/_ssl.c b/contrib/tools/python3/Modules/_ssl.c
index 498c538c6b7..34ad2c78447 100644
--- a/contrib/tools/python3/Modules/_ssl.c
+++ b/contrib/tools/python3/Modules/_ssl.c
@@ -4136,6 +4136,12 @@ _ssl__SSLContext_load_dh_params(PySSLContext *self, PyObject *filepath)
FILE *f;
DH *dh;
+#if defined(MS_WINDOWS) && defined(_DEBUG)
+ PyErr_SetString(PyExc_NotImplementedError,
+ "load_dh_params: unavailable on Windows debug build");
+ return NULL;
+#endif
+
f = _Py_fopen_obj(filepath, "rb");
if (f == NULL)
return NULL;
diff --git a/contrib/tools/python3/Modules/_ssl/debughelpers.c b/contrib/tools/python3/Modules/_ssl/debughelpers.c
index a81f0aad05a..906f5691a9e 100644
--- a/contrib/tools/python3/Modules/_ssl/debughelpers.c
+++ b/contrib/tools/python3/Modules/_ssl/debughelpers.c
@@ -164,6 +164,13 @@ _PySSLContext_get_keylog_filename(PySSLContext *self, void *c) {
static int
_PySSLContext_set_keylog_filename(PySSLContext *self, PyObject *arg, void *c) {
FILE *fp;
+
+#if defined(MS_WINDOWS) && defined(_DEBUG)
+ PyErr_SetString(PyExc_NotImplementedError,
+ "set_keylog_filename: unavailable on Windows debug build");
+ return -1;
+#endif
+
/* Reset variables and callback first */
SSL_CTX_set_keylog_callback(self->ctx, NULL);
Py_CLEAR(self->keylog_filename);
diff --git a/contrib/tools/python3/Modules/_threadmodule.c b/contrib/tools/python3/Modules/_threadmodule.c
index 366ee6186de..56a9f3d8936 100644
--- a/contrib/tools/python3/Modules/_threadmodule.c
+++ b/contrib/tools/python3/Modules/_threadmodule.c
@@ -7,6 +7,8 @@
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_pylifecycle.h"
#include "pycore_pystate.h" // _PyThreadState_SetCurrent()
+#include "pycore_sysmodule.h" // _PySys_GetOptionalAttr()
+
#include <stddef.h> // offsetof()
#include "structmember.h" // PyMemberDef
@@ -1567,9 +1569,12 @@ thread_excepthook(PyObject *module, PyObject *args)
PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2);
PyObject *thread = PyStructSequence_GET_ITEM(args, 3);
- PyThreadState *tstate = _PyThreadState_GET();
- PyObject *file = _PySys_GetAttr(tstate, &_Py_ID(stderr));
+ PyObject *file;
+ if (_PySys_GetOptionalAttr( &_Py_ID(stderr), &file) < 0) {
+ return NULL;
+ }
if (file == NULL || file == Py_None) {
+ Py_XDECREF(file);
if (thread == Py_None) {
/* do nothing if sys.stderr is None and thread is None */
Py_RETURN_NONE;
@@ -1586,9 +1591,6 @@ thread_excepthook(PyObject *module, PyObject *args)
Py_RETURN_NONE;
}
}
- else {
- Py_INCREF(file);
- }
int res = thread_excepthook_file(file, exc_type, exc_value, exc_tb,
thread);
diff --git a/contrib/tools/python3/Modules/faulthandler.c b/contrib/tools/python3/Modules/faulthandler.c
index 96cc6d8ca11..2f2b00787ed 100644
--- a/contrib/tools/python3/Modules/faulthandler.c
+++ b/contrib/tools/python3/Modules/faulthandler.c
@@ -3,6 +3,7 @@
#include "pycore_pyerrors.h" // _Py_DumpExtensionModules
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_signal.h" // Py_NSIG
+#include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
#include "pycore_traceback.h" // _Py_DumpTracebackThreads
#include <object.h>
@@ -29,14 +30,15 @@
#define PUTS(fd, str) _Py_write_noraise(fd, str, strlen(str))
-// clang uses __attribute__((no_sanitize("undefined")))
-// GCC 4.9+ uses __attribute__((no_sanitize_undefined))
-#if defined(__has_feature) // Clang
+// Clang and GCC 9.0+ use __attribute__((no_sanitize("undefined")))
+#if defined(__has_feature)
# if __has_feature(undefined_behavior_sanitizer)
# define _Py_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
# endif
#endif
-#if defined(__GNUC__) \
+
+// GCC 4.9+ uses __attribute__((no_sanitize_undefined))
+#if !defined(_Py_NO_SANITIZE_UNDEFINED) && defined(__GNUC__) \
&& ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9))
# define _Py_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize_undefined))
#endif
@@ -103,14 +105,13 @@ faulthandler_get_fileno(PyObject **file_ptr)
PyObject *file = *file_ptr;
if (file == NULL || file == Py_None) {
- PyThreadState *tstate = _PyThreadState_GET();
- file = _PySys_GetAttr(tstate, &_Py_ID(stderr));
+ file = _PySys_GetRequiredAttr(&_Py_ID(stderr));
if (file == NULL) {
- PyErr_SetString(PyExc_RuntimeError, "unable to get sys.stderr");
return -1;
}
if (file == Py_None) {
PyErr_SetString(PyExc_RuntimeError, "sys.stderr is None");
+ Py_DECREF(file);
return -1;
}
}
@@ -126,10 +127,15 @@ faulthandler_get_fileno(PyObject **file_ptr)
*file_ptr = NULL;
return fd;
}
+ else {
+ Py_INCREF(file);
+ }
result = PyObject_CallMethodNoArgs(file, &_Py_ID(fileno));
- if (result == NULL)
+ if (result == NULL) {
+ Py_DECREF(file);
return -1;
+ }
fd = -1;
if (PyLong_Check(result)) {
@@ -142,6 +148,7 @@ faulthandler_get_fileno(PyObject **file_ptr)
if (fd == -1) {
PyErr_SetString(PyExc_RuntimeError,
"file.fileno() is not a valid file descriptor");
+ Py_DECREF(file);
return -1;
}
@@ -224,19 +231,23 @@ faulthandler_dump_traceback_py(PyObject *self,
return NULL;
tstate = get_thread_state();
- if (tstate == NULL)
+ if (tstate == NULL) {
+ Py_XDECREF(file);
return NULL;
+ }
if (all_threads) {
errmsg = _Py_DumpTracebackThreads(fd, NULL, tstate);
if (errmsg != NULL) {
PyErr_SetString(PyExc_RuntimeError, errmsg);
+ Py_XDECREF(file);
return NULL;
}
}
else {
_Py_DumpTraceback(fd, tstate);
}
+ Py_XDECREF(file);
if (PyErr_CheckSignals())
return NULL;
@@ -498,10 +509,11 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs)
return NULL;
tstate = get_thread_state();
- if (tstate == NULL)
+ if (tstate == NULL) {
+ Py_XDECREF(file);
return NULL;
+ }
- Py_XINCREF(file);
Py_XSETREF(fatal_error.file, file);
fatal_error.fd = fd;
fatal_error.all_threads = all_threads;
@@ -691,12 +703,14 @@ faulthandler_dump_traceback_later(PyObject *self,
if (!thread.running) {
thread.running = PyThread_allocate_lock();
if (!thread.running) {
+ Py_XDECREF(file);
return PyErr_NoMemory();
}
}
if (!thread.cancel_event) {
thread.cancel_event = PyThread_allocate_lock();
if (!thread.cancel_event || !thread.running) {
+ Py_XDECREF(file);
return PyErr_NoMemory();
}
@@ -708,6 +722,7 @@ faulthandler_dump_traceback_later(PyObject *self,
/* format the timeout */
header = format_timeout(timeout_us);
if (header == NULL) {
+ Py_XDECREF(file);
return PyErr_NoMemory();
}
header_len = strlen(header);
@@ -715,7 +730,6 @@ faulthandler_dump_traceback_later(PyObject *self,
/* Cancel previous thread, if running */
cancel_dump_traceback_later();
- Py_XINCREF(file);
Py_XSETREF(thread.file, file);
thread.fd = fd;
/* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */
@@ -877,14 +891,17 @@ faulthandler_register_py(PyObject *self,
if (user_signals == NULL) {
user_signals = PyMem_Calloc(Py_NSIG, sizeof(user_signal_t));
- if (user_signals == NULL)
+ if (user_signals == NULL) {
+ Py_XDECREF(file);
return PyErr_NoMemory();
+ }
}
user = &user_signals[signum];
if (!user->enabled) {
#ifdef FAULTHANDLER_USE_ALT_STACK
if (faulthandler_allocate_stack() < 0) {
+ Py_XDECREF(file);
return NULL;
}
#endif
@@ -892,13 +909,13 @@ faulthandler_register_py(PyObject *self,
err = faulthandler_register(signum, chain, &previous);
if (err) {
PyErr_SetFromErrno(PyExc_OSError);
+ Py_XDECREF(file);
return NULL;
}
user->previous = previous;
}
- Py_XINCREF(file);
Py_XSETREF(user->file, file);
user->fd = fd;
user->all_threads = all_threads;
diff --git a/contrib/tools/python3/Modules/gcmodule.c b/contrib/tools/python3/Modules/gcmodule.c
index 39856b8eb70..40143bdfb0e 100644
--- a/contrib/tools/python3/Modules/gcmodule.c
+++ b/contrib/tools/python3/Modules/gcmodule.c
@@ -2445,6 +2445,23 @@ PyObject_GC_IsFinalized(PyObject *obj)
return 0;
}
+static int
+visit_generation(gcvisitobjects_t callback, void *arg, struct gc_generation *gen)
+{
+ PyGC_Head *gc_list, *gc;
+ gc_list = &gen->head;
+ for (gc = GC_NEXT(gc_list); gc != gc_list; gc = GC_NEXT(gc)) {
+ PyObject *op = FROM_GC(gc);
+ Py_INCREF(op);
+ int res = callback(op, arg);
+ Py_DECREF(op);
+ if (!res) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
void
PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
{
@@ -2453,18 +2470,11 @@ PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
int origenstate = gcstate->enabled;
gcstate->enabled = 0;
for (i = 0; i < NUM_GENERATIONS; i++) {
- PyGC_Head *gc_list, *gc;
- gc_list = GEN_HEAD(gcstate, i);
- for (gc = GC_NEXT(gc_list); gc != gc_list; gc = GC_NEXT(gc)) {
- PyObject *op = FROM_GC(gc);
- Py_INCREF(op);
- int res = callback(op, arg);
- Py_DECREF(op);
- if (!res) {
- goto done;
- }
+ if (visit_generation(callback, arg, &gcstate->generations[i])) {
+ goto done;
}
}
+ visit_generation(callback, arg, &gcstate->permanent_generation);
done:
gcstate->enabled = origenstate;
}
diff --git a/contrib/tools/python3/Modules/md5module.c b/contrib/tools/python3/Modules/md5module.c
index dcc9da38d75..b39effc00de 100644
--- a/contrib/tools/python3/Modules/md5module.c
+++ b/contrib/tools/python3/Modules/md5module.c
@@ -30,15 +30,6 @@ class MD5Type "MD5object *" "&PyType_Type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=6e5261719957a912]*/
-/* Some useful types */
-
-#if SIZEOF_INT == 4
-typedef unsigned int MD5_INT32; /* 32-bit integer */
-typedef long long MD5_INT64; /* 64-bit integer */
-#else
-/* not defined. compilation will die. */
-#endif
-
/* The MD5 block size and message digest sizes, in bytes */
#define MD5_BLOCKSIZE 64
diff --git a/contrib/tools/python3/Modules/sha1module.c b/contrib/tools/python3/Modules/sha1module.c
index 624dc57b0a3..a8311fb306c 100644
--- a/contrib/tools/python3/Modules/sha1module.c
+++ b/contrib/tools/python3/Modules/sha1module.c
@@ -30,15 +30,6 @@ class SHA1Type "SHA1object *" "&PyType_Type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3dc9a20d1becb759]*/
-/* Some useful types */
-
-#if SIZEOF_INT == 4
-typedef unsigned int SHA1_INT32; /* 32-bit integer */
-typedef long long SHA1_INT64; /* 64-bit integer */
-#else
-/* not defined. compilation will die. */
-#endif
-
/* The SHA1 block size and message digest sizes, in bytes */
#define SHA1_BLOCKSIZE 64
diff --git a/contrib/tools/python3/Modules/socketmodule.c b/contrib/tools/python3/Modules/socketmodule.c
index 7f2ebba9884..27afd73d970 100644
--- a/contrib/tools/python3/Modules/socketmodule.c
+++ b/contrib/tools/python3/Modules/socketmodule.c
@@ -1491,11 +1491,15 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
#if defined(__NetBSD__) || defined(__DragonFly__)
return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
-#else /* __NetBSD__ || __DragonFly__ */
+#elif defined(__FreeBSD__)
+ char *node = _BT_HCI_MEMB(a, node);
+ size_t len = strnlen(node, sizeof(_BT_HCI_MEMB(a, node)));
+ return PyBytes_FromStringAndSize(node, (Py_ssize_t)len);
+#else
PyObject *ret = NULL;
ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
return ret;
-#endif /* !(__NetBSD__ || __DragonFly__) */
+#endif
}
#if !defined(__FreeBSD__)
@@ -1784,6 +1788,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
assert(path.len >= 0);
struct sockaddr_un* addr = &addrbuf->un;
+ memset(addr, 0, sizeof(struct sockaddr_un));
#ifdef __linux__
if (path.len == 0 || *(const char *)path.buf == 0) {
/* Linux abstract namespace extension:
@@ -1827,6 +1832,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{
int pid, groups;
struct sockaddr_nl* addr = &addrbuf->nl;
+ memset(addr, 0, sizeof(struct sockaddr_nl));
if (!PyTuple_Check(args)) {
PyErr_Format(
PyExc_TypeError,
@@ -1854,6 +1860,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{
unsigned int node, port;
struct sockaddr_qrtr* addr = &addrbuf->sq;
+ memset(addr, 0, sizeof(struct sockaddr_qrtr));
if (!PyTuple_Check(args)) {
PyErr_Format(
PyExc_TypeError,
@@ -1931,6 +1938,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0;
}
struct sockaddr_in* addr = &addrbuf->in;
+ memset(addr, 0, sizeof(struct sockaddr_in));
result = setipaddr(s->state, host.buf, (struct sockaddr *)addr,
sizeof(*addr), AF_INET);
idna_cleanup(&host);
@@ -1976,6 +1984,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0;
}
struct sockaddr_in6* addr = &addrbuf->in6;
+ memset(addr, 0, sizeof(struct sockaddr_in6));
result = setipaddr(s->state, host.buf, (struct sockaddr *)addr,
sizeof(*addr), AF_INET6);
idna_cleanup(&host);
@@ -2014,12 +2023,14 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr_l2 *addr = &addrbuf->bt_l2;
memset(addr, 0, sizeof(struct sockaddr_l2));
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
- if (!PyArg_ParseTuple(args, "si", &straddr,
- &_BT_L2_MEMB(addr, psm))) {
+ unsigned short psm;
+ if (!PyArg_ParseTuple(args, "sH", &straddr, &psm)) {
PyErr_Format(PyExc_OSError,
"%s(): wrong format", caller);
return 0;
}
+ _BT_L2_MEMB(addr, psm) = psm;
+
if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
return 0;
@@ -2031,13 +2042,23 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{
const char *straddr;
struct sockaddr_rc *addr = &addrbuf->bt_rc;
+ memset(addr, 0, sizeof(struct sockaddr_rc));
_BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
- if (!PyArg_ParseTuple(args, "si", &straddr,
- &_BT_RC_MEMB(addr, channel))) {
- PyErr_Format(PyExc_OSError,
- "%s(): wrong format", caller);
+#ifdef MS_WINDOWS
+ unsigned long channel;
+# define FORMAT_CHANNEL "k"
+#else
+ unsigned char channel;
+# define FORMAT_CHANNEL "B"
+#endif
+ if (!PyArg_ParseTuple(args, "s" FORMAT_CHANNEL,
+ &straddr, &channel)) {
+ PyErr_Format(PyExc_OSError, "%s(): wrong format", caller);
return 0;
}
+#undef FORMAT_CHANNEL
+ _BT_RC_MEMB(addr, channel) = channel;
+
if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
return 0;
@@ -2048,6 +2069,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
case BTPROTO_HCI:
{
struct sockaddr_hci *addr = &addrbuf->bt_hci;
+ memset(addr, 0, sizeof(struct sockaddr_hci));
#if defined(__NetBSD__) || defined(__DragonFly__)
const char *straddr;
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
@@ -2059,14 +2081,37 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
straddr = PyBytes_AS_STRING(args);
if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
return 0;
-#else /* __NetBSD__ || __DragonFly__ */
+#elif defined(__FreeBSD__)
+ _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
+ if (!PyBytes_Check(args)) {
+ PyErr_Format(PyExc_OSError, "%s: "
+ "wrong node format", caller);
+ return 0;
+ }
+ const char *straddr = PyBytes_AS_STRING(args);
+ size_t len = PyBytes_GET_SIZE(args);
+ if (strlen(straddr) != len) {
+ PyErr_Format(PyExc_ValueError, "%s: "
+ "node contains embedded null character", caller);
+ return 0;
+ }
+ if (len > sizeof(_BT_HCI_MEMB(addr, node))) {
+ PyErr_Format(PyExc_ValueError, "%s: "
+ "node too long", caller);
+ return 0;
+ }
+ strncpy(_BT_HCI_MEMB(addr, node), straddr,
+ sizeof(_BT_HCI_MEMB(addr, node)));
+#else
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
- if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
+ unsigned short dev = _BT_HCI_MEMB(addr, dev);
+ if (!PyArg_ParseTuple(args, "H", &dev)) {
PyErr_Format(PyExc_OSError,
"%s(): wrong format", caller);
return 0;
}
-#endif /* !(__NetBSD__ || __DragonFly__) */
+ _BT_HCI_MEMB(addr, dev) = dev;
+#endif
*len_ret = sizeof *addr;
return 1;
}
@@ -2076,6 +2121,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
const char *straddr;
struct sockaddr_sco *addr = &addrbuf->bt_sco;
+ memset(addr, 0, sizeof(struct sockaddr_sco));
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyBytes_Check(args)) {
PyErr_Format(PyExc_OSError,
@@ -2153,6 +2199,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0;
}
struct sockaddr_ll* addr = &addrbuf->ll;
+ memset(addr, 0, sizeof(struct sockaddr_ll));
addr->sll_family = AF_PACKET;
addr->sll_protocol = htons((short)protoNumber);
addr->sll_ifindex = ifr.ifr_ifindex;
@@ -2237,6 +2284,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct ifreq ifr;
Py_ssize_t len;
struct sockaddr_can *addr = &addrbuf->can;
+ memset(addr, 0, sizeof(struct sockaddr_can));
if (!PyTuple_Check(args)) {
PyErr_Format(PyExc_TypeError,
@@ -2289,6 +2337,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
unsigned long int rx_id, tx_id;
struct sockaddr_can *addr = &addrbuf->can;
+ memset(addr, 0, sizeof(struct sockaddr_can));
if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
&interfaceName,
@@ -2336,6 +2385,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
uint8_t j1939_addr;
struct sockaddr_can *addr = &addrbuf->can;
+ memset(addr, 0, sizeof(struct sockaddr_can));
if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter,
&interfaceName,
@@ -2388,6 +2438,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
case SYSPROTO_CONTROL:
{
struct sockaddr_ctl *addr = &addrbuf->ctl;
+ memset(addr, 0, sizeof(struct sockaddr_ctl));
addr->sc_family = AF_SYSTEM;
addr->ss_sysaddr = AF_SYS_CONTROL;
diff --git a/contrib/tools/python3/Modules/syslogmodule.c b/contrib/tools/python3/Modules/syslogmodule.c
index c925a42dc05..55ed2426fb4 100644
--- a/contrib/tools/python3/Modules/syslogmodule.c
+++ b/contrib/tools/python3/Modules/syslogmodule.c
@@ -49,8 +49,13 @@ Revision history:
/* syslog module */
+#ifndef Py_BUILD_CORE_BUILTIN
+# define Py_BUILD_CORE_MODULE 1
+#endif
+
#include "Python.h"
#include "osdefs.h" // SEP
+#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
#include <syslog.h>
@@ -84,45 +89,50 @@ syslog_get_argv(void)
Py_ssize_t argv_len, scriptlen;
PyObject *scriptobj;
Py_ssize_t slash;
- PyObject *argv = PySys_GetObject("argv");
+ PyObject *argv;
- if (argv == NULL) {
- return(NULL);
+ if (_PySys_GetOptionalAttrString("argv", &argv) <= 0) {
+ return NULL;
}
argv_len = PyList_Size(argv);
if (argv_len == -1) {
PyErr_Clear();
- return(NULL);
+ Py_DECREF(argv);
+ return NULL;
}
if (argv_len == 0) {
- return(NULL);
+ Py_DECREF(argv);
+ return NULL;
}
scriptobj = PyList_GetItem(argv, 0);
+ Py_XINCREF(scriptobj);
+ Py_DECREF(argv);
if (scriptobj == NULL) {
PyErr_Clear();
return NULL;
}
if (!PyUnicode_Check(scriptobj)) {
- return(NULL);
+ Py_DECREF(scriptobj);
+ return NULL;
}
scriptlen = PyUnicode_GET_LENGTH(scriptobj);
if (scriptlen == 0) {
- return(NULL);
+ Py_DECREF(scriptobj);
+ return NULL;
}
slash = PyUnicode_FindChar(scriptobj, SEP, 0, scriptlen, -1);
if (slash == -2) {
PyErr_Clear();
+ Py_DECREF(scriptobj);
return NULL;
}
if (slash != -1) {
- return PyUnicode_Substring(scriptobj, slash + 1, scriptlen);
- } else {
- Py_INCREF(scriptobj);
- return(scriptobj);
+ Py_SETREF(scriptobj, PyUnicode_Substring(scriptobj, slash + 1, scriptlen));
}
+ return scriptobj;
}
@@ -156,6 +166,9 @@ syslog_openlog_impl(PyObject *module, PyObject *ident, long logopt,
else {
/* get sys.argv[0] or NULL if we can't for some reason */
ident = syslog_get_argv();
+ if (ident == NULL && PyErr_Occurred()) {
+ return NULL;
+ }
}
/* At this point, ident should be INCREF()ed. openlog(3) does not