https://github.com/python/cpython/commit/7a29c9883f4cf61372895362e865f7d2f99bd4ca
commit: 7a29c9883f4cf61372895362e865f7d2f99bd4ca
branch: main
author: Gregory P. Smith <[email protected]>
committer: gpshead <[email protected]>
date: 2025-04-14T06:22:29Z
summary:
GH-115322: fix ctypes call_function audit hook on 32-bit platforms (GH-132496)
* GH-115322: fix ctypes call_function audit hook on 32-bit platforms.
It was using a signed conversion to communicate the function id (pointer) value.
files:
M Lib/test/audit-tests.py
M Misc/NEWS.d/next/Security/2024-02-18-02-53-25.gh-issue-115322.Um2Sjx.rst
M Modules/_ctypes/callproc.c
diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py
index 3d81f27e5cb46d..08b638e4b8d524 100644
--- a/Lib/test/audit-tests.py
+++ b/Lib/test/audit-tests.py
@@ -311,10 +311,10 @@ def test_ctypes_call_function():
with TestHook() as hook:
_ctypes.call_function(ctypes._memmove_addr, (0, 0, 0))
- assert ("ctypes.call_function", (ctypes._memmove_addr, (0, 0, 0))) in
hook.seen
+ assert ("ctypes.call_function", (ctypes._memmove_addr, (0, 0, 0))) in
hook.seen, f"{ctypes._memmove_addr=} {hook.seen=}"
ctypes.CFUNCTYPE(ctypes.c_voidp)(ctypes._memset_addr)(1, 0, 0)
- assert ("ctypes.call_function", (ctypes._memset_addr, (1, 0, 0))) in
hook.seen
+ assert ("ctypes.call_function", (ctypes._memset_addr, (1, 0, 0))) in
hook.seen, f"{ctypes._memset_addr=} {hook.seen=}"
with TestHook() as hook:
ctypes.cast(ctypes.c_voidp(0), ctypes.POINTER(ctypes.c_char))
diff --git
a/Misc/NEWS.d/next/Security/2024-02-18-02-53-25.gh-issue-115322.Um2Sjx.rst
b/Misc/NEWS.d/next/Security/2024-02-18-02-53-25.gh-issue-115322.Um2Sjx.rst
index a09e1f1fcdcab7..8eb5c3ed04ee2c 100644
--- a/Misc/NEWS.d/next/Security/2024-02-18-02-53-25.gh-issue-115322.Um2Sjx.rst
+++ b/Misc/NEWS.d/next/Security/2024-02-18-02-53-25.gh-issue-115322.Um2Sjx.rst
@@ -1,4 +1,5 @@
The underlying extension modules behind :mod:`readline`:, :mod:`subprocess`,
and :mod:`ctypes` now raise audit events on previously uncovered code paths
that could lead to file system access related to C function calling and
-external binary execution.
+external binary execution. The ``ctypes.call_function`` audit hook has also
+been fixed to use an unsigned value for its ``function pointer``.
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index f5db49ff4bc61c..cb8ab7b33a2953 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1199,8 +1199,17 @@ PyObject *_ctypes_callproc(ctypes_state *st,
PyObject *retval = NULL;
// Both call_function and call_cdeclfunction call us:
+#if SIZEOF_VOID_P == SIZEOF_LONG
+ if (PySys_Audit("ctypes.call_function", "kO",
+ (unsigned long)pProc, argtuple) < 0) {
+#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
+ if (PySys_Audit("ctypes.call_function", "KO",
+ (unsigned long long)pProc, argtuple) < 0) {
+#else
+# warning "unexpected pointer size, you may see odd values in audit hooks"
if (PySys_Audit("ctypes.call_function", "nO",
(Py_ssize_t)pProc, argtuple) < 0) {
+#endif
return NULL;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]