Discussion:
[Python-3000-checkins] r64972 - in python/branches/py3k: Lib/ctypes/test/test_pep3118.py Misc/NEWS Modules/_ctypes/_ctypes.c
thomas.heller
2008-07-15 17:25:08 UTC
Permalink
Author: thomas.heller
Date: Tue Jul 15 19:25:07 2008
New Revision: 64972

Log:
Merged revisions 64968,64971 via svnmerge from
svn+ssh://pythondev at svn.python.org/python/trunk

........
r64968 | thomas.heller | 2008-07-15 19:03:08 +0200 (Di, 15 Jul 2008) | 4 lines

Issue #3258: Fix an assertion error (in debug build) and a crash (in
release build) when the format string of a pointer to an incomplete
structure is created.
........
r64971 | thomas.heller | 2008-07-15 19:19:50 +0200 (Di, 15 Jul 2008) | 2 lines

NEWS entry for #issue 3258.
........


Modified:
python/branches/py3k/ (props changed)
python/branches/py3k/Lib/ctypes/test/test_pep3118.py
python/branches/py3k/Misc/NEWS
python/branches/py3k/Modules/_ctypes/_ctypes.c

Modified: python/branches/py3k/Lib/ctypes/test/test_pep3118.py
==============================================================================
--- python/branches/py3k/Lib/ctypes/test/test_pep3118.py (original)
+++ python/branches/py3k/Lib/ctypes/test/test_pep3118.py Tue Jul 15 19:25:07 2008
@@ -12,6 +12,8 @@
def normalize(format):
# Remove current endian specifier and white space from a format
# string
+ if format is None:
+ return ""
format = format.replace(OTHER_ENDIAN, THIS_ENDIAN)
return re.sub(r"\s", "", format)

@@ -84,6 +86,14 @@
class aUnion(Union):
_fields_ = [("a", c_int)]

+class Incomplete(Structure):
+ pass
+
+class Complete(Structure):
+ pass
+PComplete = POINTER(Complete)
+Complete._fields_ = [("a", c_int)]
+
################################################################
#
# This table contains format strings as they look on little endian
@@ -141,6 +151,16 @@
# the pep does't support unions
(aUnion, "B", None, aUnion),

+ ## pointer to incomplete structure
+ (Incomplete, "B", None, Incomplete),
+ (POINTER(Incomplete), "&B", None, POINTER(Incomplete)),
+
+ # 'Complete' is a structure that starts incomplete, but is completed after the
+ # pointer type to it has been created.
+ (Complete, "T{<l:a:}", None, Complete),
+ # Unfortunately the pointer format string is not fixed...
+ (POINTER(Complete), "&B", None, POINTER(Complete)),
+
## other

# function signatures are not implemented

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Tue Jul 15 19:25:07 2008
@@ -27,6 +27,9 @@
Library
-------

+- Issue #3258: Fixed a crash when a ctypes POINTER type to an
+ incomplete structure was created.
+
- Issue #2683: Fix inconsistency in subprocess.Popen.communicate(): the
argument now must be a bytes object in any case.


Modified: python/branches/py3k/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/branches/py3k/Modules/_ctypes/_ctypes.c (original)
+++ python/branches/py3k/Modules/_ctypes/_ctypes.c Tue Jul 15 19:25:07 2008
@@ -353,6 +353,11 @@
}
Py_DECREF(result->tp_dict);
result->tp_dict = (PyObject *)dict;
+ dict->format = alloc_format_string(NULL, "B");
+ if (dict->format == NULL) {
+ Py_DECREF(result);
+ return NULL;
+ }

dict->paramfunc = StructUnionType_paramfunc;

@@ -871,7 +876,13 @@
if (proto) {
StgDictObject *itemdict = PyType_stgdict(proto);
assert(itemdict);
- stgdict->format = alloc_format_string("&", itemdict->format);
+ /* If itemdict->format is NULL, then this is a pointer to an
+ incomplete type. We create a generic format string
+ 'pointer to bytes' in this case. XXX Better would be to
+ fix the format string later...
+ */
+ stgdict->format = alloc_format_string("&",
+ itemdict->format ? itemdict->format : "B");
if (stgdict->format == NULL) {
Py_DECREF((PyObject *)stgdict);
return NULL;

Loading...