[Python-checkins] [3.8] bpo-40052: Fix alignment issue in PyVectorcall_Function() (GH-23999) (GH-24120)
encukou
webhook-mailer at python.org
Tue Jan 12 09:45:13 EST 2021
https://github.com/python/cpython/commit/187f76def8a5bd0af7ab512575cad30cfe624b05
commit: 187f76def8a5bd0af7ab512575cad30cfe624b05
branch: 3.8
author: Petr Viktorin <encukou at gmail.com>
committer: encukou <encukou at gmail.com>
date: 2021-01-12T15:45:05+01:00
summary:
[3.8] bpo-40052: Fix alignment issue in PyVectorcall_Function() (GH-23999) (GH-24120)
Co-Authored-By: Andreas Schneider <asn at cryptomilk.org>
Co-Authored-By: Antoine Pitrou <antoine at python.org>.
Co-authored-by: Petr Viktorin <encukou at gmail.com>
(cherry picked from commit 056c08211b402b4dbc1530a9de9d00ad5309909f)
https://bugs.python.org/issue40052
files:
A Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst
M Include/cpython/abstract.h
M Objects/call.c
diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h
index 2ea3209bca109..dbfce2dc9061d 100644
--- a/Include/cpython/abstract.h
+++ b/Include/cpython/abstract.h
@@ -82,14 +82,14 @@ _PyVectorcall_Function(PyObject *callable)
{
PyTypeObject *tp = Py_TYPE(callable);
Py_ssize_t offset = tp->tp_vectorcall_offset;
- vectorcallfunc *ptr;
+ vectorcallfunc ptr;
if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) {
return NULL;
}
assert(PyCallable_Check(callable));
assert(offset > 0);
- ptr = (vectorcallfunc*)(((char *)callable) + offset);
- return *ptr;
+ memcpy(&ptr, (char *) callable + offset, sizeof(ptr));
+ return ptr;
}
/* Call the callable object 'callable' with the "vectorcall" calling
diff --git a/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst b/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst
new file mode 100644
index 0000000000000..538488e2fbacc
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst
@@ -0,0 +1,2 @@
+Fix an alignment build warning/error in function ``PyVectorcall_Function()``.
+Patch by Andreas Schneider, Antoine Pitrou and Petr Viktorin.
diff --git a/Objects/call.c b/Objects/call.c
index c66389854d8bf..9672be01ed059 100644
--- a/Objects/call.c
+++ b/Objects/call.c
@@ -175,13 +175,14 @@ PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
{
/* get vectorcallfunc as in _PyVectorcall_Function, but without
* the _Py_TPFLAGS_HAVE_VECTORCALL check */
+ vectorcallfunc func;
Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
if (offset <= 0) {
PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
Py_TYPE(callable)->tp_name);
return NULL;
}
- vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset);
+ memcpy(&func, (char *) callable + offset, sizeof(func));
if (func == NULL) {
PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
Py_TYPE(callable)->tp_name);
More information about the Python-checkins
mailing list