summaryrefslogtreecommitdiffstats
path: root/Modules/_multiprocessing/semaphore.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-12-16 11:28:32 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-12-16 11:28:32 (GMT)
commitc345ce1a69b3c4a46d87ef56d859bc70abfc74b4 (patch)
tree5481a8c3e31ae8a423aed9199a1fe2b22694d1c0 /Modules/_multiprocessing/semaphore.c
parent87448819abd4900bcb36857c6706d8562c97a099 (diff)
downloadcpython-c345ce1a69b3c4a46d87ef56d859bc70abfc74b4.zip
cpython-c345ce1a69b3c4a46d87ef56d859bc70abfc74b4.tar.gz
cpython-c345ce1a69b3c4a46d87ef56d859bc70abfc74b4.tar.bz2
Issue #10350: Read and save errno before calling a function which might overwrite it.
Original patch by Hallvard B Furuseth.
Diffstat (limited to 'Modules/_multiprocessing/semaphore.c')
-rw-r--r--Modules/_multiprocessing/semaphore.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c
index c2cd914..1f37d6a 100644
--- a/Modules/_multiprocessing/semaphore.c
+++ b/Modules/_multiprocessing/semaphore.c
@@ -267,7 +267,7 @@ sem_timedwait_save(sem_t *sem, struct timespec *deadline, PyThreadState *_save)
static PyObject *
semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
{
- int blocking = 1, res;
+ int blocking = 1, res, err = 0;
double timeout;
PyObject *timeout_obj = Py_None;
struct timespec deadline = {0};
@@ -313,11 +313,13 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
else
res = sem_timedwait(self->handle, &deadline);
Py_END_ALLOW_THREADS
+ err = errno;
if (res == MP_EXCEPTION_HAS_BEEN_SET)
break;
} while (res < 0 && errno == EINTR && !PyErr_CheckSignals());
if (res < 0) {
+ errno = err;
if (errno == EAGAIN || errno == ETIMEDOUT)
Py_RETURN_FALSE;
else if (errno == EINTR)