From 7644262aa5ef62a0e033ac1158b7cc7b41ffdd1a Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Mon, 10 Jul 2006 11:11:10 +0000 Subject: Assigning None to pointer type structure fields possible overwrote wrong fields. --- Lib/ctypes/test/test_structures.py | 10 ++++++++++ Misc/NEWS | 3 +++ Modules/_ctypes/_ctypes.c | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index bb56a61..8a4531d 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -371,5 +371,15 @@ class PointerMemberTestCase(unittest.TestCase): items = [s.array[i] for i in range(3)] self.failUnlessEqual(items, [1, 2, 3]) + def test_none_to_pointer_fields(self): + class S(Structure): + _fields_ = [("x", c_int), + ("p", POINTER(c_int))] + + s = S() + s.x = 12345678 + s.p = None + self.failUnlessEqual(s.x, 12345678) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 157c165..a0266c4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -39,6 +39,9 @@ Core and builtins Library ------- +- Assigning None to pointer type fields in ctypes structures possible + overwrote the wrong fields, this is fixed now. + - Fixed a segfault in _ctypes when ctypes.wintypes were imported on non-Windows platforms. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index f786ead..b332932 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2187,7 +2187,7 @@ _CData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, Py_DECREF(ob); return result; } else if (value == Py_None && PointerTypeObject_Check(type)) { - *(void **)dst->b_ptr = NULL; + *(void **)ptr = NULL; Py_INCREF(Py_None); return Py_None; } else { -- cgit v0.12