[PyQt] Bug in sip.voidptr?

Phil Thompson phil at riverbankcomputing.com
Sat Dec 11 09:54:29 GMT 2010


On Fri, 10 Dec 2010 15:56:23 -0500, Nathan Weston <nathan at genarts.com>
wrote:
> I think I've found a bug when constructing sip.voidptr from an integer. 
> This statement:
> sip.voidptr(2**31)
> 
> raises an exception: TypeError: a single integer, Capsule, CObject, None

> or another voidptr is required
> 
> The problem appears to be at voidptr.c:568
> ptr = (void *)PyInt_AsLong(arg)
> 
> Python integers are signed, so 2**31 isn't a valid int (even though it's

> a valid 32-bit pointer), thus the cast fails. Values smaller than 2**31 
> work fine. I was able to fix the problem by changing the cast to this:
> 
> ptr = (void *)PyLong_AsUnsignedLong(arg);
> 
> I'm not sure if this handles all overflows correctly (since a Python 
> long can be larger than 2**32), but it works for me.
> 
> 
> Versions:
> Centos 5  (64-bit)
> Python 2.6.6 (32-bit)
> sip 4.11.1

I've changed it to use PyLong_AsVoidPtr() which (for some reason) I had
thought was Python v3 only.

Thanks,
Phil


More information about the PyQt mailing list