Compare commits

..

4 Commits

Author SHA1 Message Date
Hai Shi 7c83eaa536
bpo-41798: pyexpat: Allocate the expat_CAPI on the heap memory (GH-24061) 2021-01-03 16:47:44 +01:00
Erlend Egeberg Aasland b8eb376590
bpo-40077: Add traverse/clear/free to arraymodule (GH-24066) 2021-01-03 14:11:15 +01:00
Zackery Spytz 6613676861
bpo-38308: Fix the "versionchanged" for the *weights* of harmonic_mean() (GH-23919) 2021-01-03 14:35:26 +02:00
Zackery Spytz 5d3553b0a8
bpo-42814: Fix undefined behavior in Objects/genericaliasobject.c (GH-24073)
In is_typing_name(), va_end() is not always called before the
function returns.  It is undefined behavior to call va_start()
without also calling va_end().
2021-01-03 13:18:25 +01:00
5 changed files with 76 additions and 35 deletions

View File

@ -198,7 +198,7 @@ However, for reading convenience, most of the examples show sorted sequences.
.. versionadded:: 3.6
.. versionchanged:: 3.8
.. versionchanged:: 3.10
Added support for *weights*.
.. function:: median(data)

View File

@ -0,0 +1 @@
Fix undefined behavior in ``Objects/genericaliasobject.c``.

View File

@ -2977,18 +2977,42 @@ static PyType_Spec arrayiter_spec = {
/*********************** Install Module **************************/
static int
array_traverse(PyObject *module, visitproc visit, void *arg)
{
array_state *state = get_array_state(module);
Py_VISIT(state->ArrayType);
Py_VISIT(state->ArrayIterType);
return 0;
}
static int
array_clear(PyObject *module)
{
array_state *state = get_array_state(module);
Py_CLEAR(state->ArrayType);
Py_CLEAR(state->ArrayIterType);
return 0;
}
static void
array_free(void *module)
{
array_clear((PyObject *)module);
}
/* No functions in array module. */
static PyMethodDef a_methods[] = {
ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF
{NULL, NULL, 0, NULL} /* Sentinel */
};
#define CREATE_TYPE(module, type, spec) \
do { \
type = (PyTypeObject *)PyType_FromModuleAndSpec(m, spec, NULL); \
if (type == NULL) { \
return -1; \
} \
#define CREATE_TYPE(module, type, spec) \
do { \
type = (PyTypeObject *)PyType_FromModuleAndSpec(module, spec, NULL); \
if (type == NULL) { \
return -1; \
} \
} while (0)
static int
@ -3059,6 +3083,9 @@ static struct PyModuleDef arraymodule = {
.m_doc = module_doc,
.m_methods = a_methods,
.m_slots = arrayslots,
.m_traverse = array_traverse,
.m_clear = array_clear,
.m_free = array_free,
};

View File

@ -1836,6 +1836,13 @@ error:
}
#endif
static void
pyexpat_destructor(PyObject *op)
{
void *p = PyCapsule_GetPointer(op, PyExpat_CAPSULE_NAME);
PyMem_Free(p);
}
static int
pyexpat_exec(PyObject *mod)
{
@ -1921,40 +1928,46 @@ pyexpat_exec(PyObject *mod)
MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS);
#undef MYCONST
static struct PyExpat_CAPI capi;
struct PyExpat_CAPI *capi = PyMem_Calloc(1, sizeof(struct PyExpat_CAPI));
if (capi == NULL) {
PyErr_NoMemory();
return -1;
}
/* initialize pyexpat dispatch table */
capi.size = sizeof(capi);
capi.magic = PyExpat_CAPI_MAGIC;
capi.MAJOR_VERSION = XML_MAJOR_VERSION;
capi.MINOR_VERSION = XML_MINOR_VERSION;
capi.MICRO_VERSION = XML_MICRO_VERSION;
capi.ErrorString = XML_ErrorString;
capi.GetErrorCode = XML_GetErrorCode;
capi.GetErrorColumnNumber = XML_GetErrorColumnNumber;
capi.GetErrorLineNumber = XML_GetErrorLineNumber;
capi.Parse = XML_Parse;
capi.ParserCreate_MM = XML_ParserCreate_MM;
capi.ParserFree = XML_ParserFree;
capi.SetCharacterDataHandler = XML_SetCharacterDataHandler;
capi.SetCommentHandler = XML_SetCommentHandler;
capi.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand;
capi.SetElementHandler = XML_SetElementHandler;
capi.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler;
capi.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler;
capi.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler;
capi.SetUserData = XML_SetUserData;
capi.SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler;
capi.SetEncoding = XML_SetEncoding;
capi.DefaultUnknownEncodingHandler = PyUnknownEncodingHandler;
capi->size = sizeof(*capi);
capi->magic = PyExpat_CAPI_MAGIC;
capi->MAJOR_VERSION = XML_MAJOR_VERSION;
capi->MINOR_VERSION = XML_MINOR_VERSION;
capi->MICRO_VERSION = XML_MICRO_VERSION;
capi->ErrorString = XML_ErrorString;
capi->GetErrorCode = XML_GetErrorCode;
capi->GetErrorColumnNumber = XML_GetErrorColumnNumber;
capi->GetErrorLineNumber = XML_GetErrorLineNumber;
capi->Parse = XML_Parse;
capi->ParserCreate_MM = XML_ParserCreate_MM;
capi->ParserFree = XML_ParserFree;
capi->SetCharacterDataHandler = XML_SetCharacterDataHandler;
capi->SetCommentHandler = XML_SetCommentHandler;
capi->SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand;
capi->SetElementHandler = XML_SetElementHandler;
capi->SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler;
capi->SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler;
capi->SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler;
capi->SetUserData = XML_SetUserData;
capi->SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler;
capi->SetEncoding = XML_SetEncoding;
capi->DefaultUnknownEncodingHandler = PyUnknownEncodingHandler;
#if XML_COMBINED_VERSION >= 20100
capi.SetHashSalt = XML_SetHashSalt;
capi->SetHashSalt = XML_SetHashSalt;
#else
capi.SetHashSalt = NULL;
capi->SetHashSalt = NULL;
#endif
/* export using capsule */
PyObject *capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL);
PyObject *capi_object = PyCapsule_New(capi, PyExpat_CAPSULE_NAME,
pyexpat_destructor);
if (capi_object == NULL) {
PyMem_Free(capi);
return -1;
}

View File

@ -173,6 +173,7 @@ is_typing_name(PyObject *obj, int num, ...)
break;
}
}
va_end(names);
if (!hit) {
return 0;
}
@ -184,7 +185,6 @@ is_typing_name(PyObject *obj, int num, ...)
&& _PyUnicode_EqualToASCIIString(module, "typing");
Py_DECREF(module);
va_end(names);
return res;
}