diff options
author | shadchin <[email protected]> | 2025-06-13 00:05:26 +0300 |
---|---|---|
committer | shadchin <[email protected]> | 2025-06-13 00:35:30 +0300 |
commit | 796b9088366b10b4cd42885101fc20c0b5709b07 (patch) | |
tree | f287eacb0b95ffd7cabf95b16cafb4788645dc38 /contrib/tools/python3/Modules | |
parent | c72bca862651e507d2ff4980ef7f4ff7267a7227 (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.c | 6 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_datetimemodule.c | 101 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_elementtree.c | 122 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_hashopenssl.c | 293 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_io/winconsoleio.c | 2 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_pickle.c | 12 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_sqlite/row.c | 25 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_sqlite/ya.make | 4 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_ssl.c | 6 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_ssl/debughelpers.c | 7 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/_threadmodule.c | 12 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/faulthandler.c | 45 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/gcmodule.c | 30 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/md5module.c | 9 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/sha1module.c | 9 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/socketmodule.c | 73 | ||||
-rw-r--r-- | contrib/tools/python3/Modules/syslogmodule.c | 35 |
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 |