]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38748: Add ctypes test for stack corruption due to misaligned arguments (GH-26204)
authorMichael Curran <mick@nvaccess.org>
Mon, 26 Sep 2022 16:27:44 +0000 (02:27 +1000)
committerGitHub <noreply@github.com>
Mon, 26 Sep 2022 16:27:44 +0000 (17:27 +0100)
Lib/test/test_ctypes/test_callbacks.py
Modules/_ctypes/_ctypes_test.c

index b5bef04e14d20857cad54c67535fd6973980ea86..e8fa3e6f7aca514aea069e60204632265bbb3735 100644 (file)
@@ -1,3 +1,4 @@
+import sys
 import functools
 import unittest
 from test import support
@@ -150,6 +151,18 @@ class Callbacks(unittest.TestCase):
                 gc.collect()
         CFUNCTYPE(None)(lambda x=Nasty(): None)
 
+    @need_symbol('WINFUNCTYPE')
+    def test_i38748_stackCorruption(self):
+        callback_funcType = WINFUNCTYPE(c_long, c_long, c_longlong)
+        @callback_funcType
+        def callback(a, b):
+            c = a + b
+            print(f"a={a}, b={b}, c={c}")
+            return c
+        dll = cdll[_ctypes_test.__file__]
+        # With no fix for i38748, the next line will raise OSError and cause the test to fail.
+        self.assertEqual(dll._test_i38748_runCallback(callback, 5, 10), 15)
+
 
 @need_symbol('WINFUNCTYPE')
 class StdcallCallbacks(Callbacks):
index 770c96c60d1f7d2ab125c0d8f3452658238f6595..e1f91b476a49fdc193f417cb6f187adbc6bdebdb 100644 (file)
@@ -1034,6 +1034,19 @@ EXPORT (HRESULT) KeepObject(IUnknown *punk)
 
 #endif
 
+#ifdef MS_WIN32
+
+// i38748: c stub for testing stack corruption 
+// When executing a Python callback with a long and a long long
+
+typedef long(__stdcall *_test_i38748_funcType)(long, long long);
+
+EXPORT(long) _test_i38748_runCallback(_test_i38748_funcType callback, int a, int b) {
+    return callback(a, b);
+}
+
+#endif
+
 static struct PyModuleDef_Slot _ctypes_test_slots[] = {
     {0, NULL}
 };