errno is sometimes read too late after the error: After another call
may have modified it. Here's a patch against py3k. Most of it or a
variant applies to 2.7 too, but I haven't really looked at that.
I've not looked at math code, where I don't even know what sets errno.
There might also be a late errno read at Modules/_ctypes/callproc.c
line 794: "space[0] = errno;". Does it want the errno from before
_ctypes_get_errobj()? I'm unsure what's going on there.
Modules/_multiprocessing/semaphore.c doesn't need the patch's extra
variable, it can instead be rearranged with the commented-out patch. |