mirror of https://github.com/python/cpython
Revert "gh-46376: Return existing pointer when possible in ctypes (#1… (#108688)
This reverts commit08447b5deb
. Revert also _ctypes.c changes of the PyDict_ContainsString() change, commit6726626646
.
This commit is contained in:
parent
44fc378b59
commit
5a79d2ae57
|
@ -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):
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
Prevent memory leak and use-after-free when using pointers to pointers with ctypes
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue