You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
gh-161390: Reject non-ctypes objects assigned to pointer contents - #161402
Assigning a non-ctypes object to ctypes pointer contents cast that object to CDataObject when isinstance() was fooled by a spoofed __class__. That crashed the interpreter.
Pointer.contents now requires a real ctypes object and raises TypeError otherwise.
No. The isinstance check only ran when the value was not already a ctypes object, and a true result was still cast to CDataObject so its b_ptr could be used. There is no valid object for which that cast works.
A real ctypes value never took that branch. CDataObject_Check uses the real type, and instances of c_int (including a Python subclass) are subclasses of _ctypes._CData. Assigning one still goes through the same path as before:
classMyInt(ctypes.c_int):
passptr=ctypes.pointer(ctypes.c_int(1))
ptr.contents=MyInt(7) # still accepted
The objects that pass isinstance and fail CDataObject_Check are objects whose __class__ is not their real type. Using those as a CDataObject crashed, which is the bug in the report. They now raise TypeError.
Assigning a different real ctypes type, such as c_char to a pointer to c_int, is unchanged. That was already accepted without the isinstance check.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Assigning a non-ctypes object to
ctypespointercontentscast that object toCDataObjectwhenisinstance()was fooled by a spoofed__class__. That crashed the interpreter.Pointer.contentsnow requires a real ctypes object and raisesTypeErrorotherwise.#161390
_Pointer.contentssetter casts a__class__-spoofed value toCDataObject *#161390