]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Revert "gh-46376: Return existing pointer when possible in ctypes (#1… (#108688)
authorVictor Stinner <vstinner@python.org>
Mon, 4 Sep 2023 09:21:47 +0000 (11:21 +0200)
committerGitHub <noreply@github.com>
Mon, 4 Sep 2023 09:21:47 +0000 (11:21 +0200)
This reverts commit 08447b5deb47e2a0df87fa0a0576d300e5c909b4.

Revert also _ctypes.c changes of the PyDict_ContainsString() change,
commit 67266266469fe0e817736227f39537182534c1a5.

Lib/test/test_ctypes/test_keeprefs.py
Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst [deleted file]
Modules/_ctypes/_ctypes.c

index c6fe1de62eae7c10ffdab0706ba9e9674123d1c2..23b03b64b4a7161c17e91f58f76f6e5e9101d1a9 100644 (file)
@@ -98,33 +98,6 @@ class PointerTestCase(unittest.TestCase):
         x = pointer(i)
         self.assertEqual(x._objects, {'1': i})
 
-    def test_pp_ownership(self):
-        d = c_int(123)
-        n = c_int(456)
-
-        p = pointer(d)
-        pp = pointer(p)
-
-        self.assertIs(pp._objects['1'], p)
-        self.assertIs(pp._objects['0']['1'], d)
-
-        pp.contents.contents = n
-
-        self.assertIs(pp._objects['1'], p)
-        self.assertIs(pp._objects['0']['1'], n)
-
-        self.assertIs(p._objects['1'], n)
-        self.assertEqual(len(p._objects), 1)
-
-        del d
-        del p
-
-        self.assertIs(pp._objects['0']['1'], n)
-        self.assertEqual(len(pp._objects), 2)
-
-        del n
-
-        self.assertEqual(len(pp._objects), 2)
 
 class PointerToStructure(unittest.TestCase):
     def test(self):
diff --git a/Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst b/Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst
deleted file mode 100644 (file)
index 8e8f024..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Prevent memory leak and use-after-free when using pointers to pointers with ctypes
index ed9efcad9ab0c83015bdf78a011bf6b0796a18bb..3af3a80bfb5e95ade206ca179afae0b766947123 100644 (file)
@@ -5148,41 +5148,6 @@ Pointer_get_contents(CDataObject *self, void *closure)
 
     stgdict = PyObject_stgdict((PyObject *)self);
     assert(stgdict); /* Cannot be NULL for pointer instances */
-
-    PyObject *keep = GetKeepedObjects(self);
-    if (keep != NULL) {
-        // check if it's a pointer to a pointer:
-        // pointers will have '0' key in the _objects
-        int ptr_probe = PyDict_ContainsString(keep, "0");
-        if (ptr_probe < 0) {
-            return NULL;
-        }
-        if (ptr_probe) {
-            PyObject *item;
-            if (PyDict_GetItemStringRef(keep, "1", &item) < 0) {
-                return NULL;
-            }
-            if (item == NULL) {
-                PyErr_SetString(PyExc_ValueError,
-                                "Unexpected NULL pointer in _objects");
-                return NULL;
-            }
-#ifndef NDEBUG
-            CDataObject *ptr2ptr = (CDataObject *)item;
-            // Don't construct a new object,
-            // return existing one instead to preserve refcount.
-            // Double-check that we are returning the same thing.
-            assert(
-                *(void**) self->b_ptr == ptr2ptr->b_ptr ||
-                *(void**) self->b_value.c == ptr2ptr->b_ptr ||
-                *(void**) self->b_ptr == ptr2ptr->b_value.c ||
-                *(void**) self->b_value.c == ptr2ptr->b_value.c
-            );
-#endif
-            return item;
-        }
-    }
-
     return PyCData_FromBaseObj(stgdict->proto,
                              (PyObject *)self, 0,
                              *(void **)self->b_ptr);