diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-11-05 19:54:58 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-11-05 19:54:58 (GMT) |
commit | 8d46e4267ceb92409ff86f6e7094ee196d5e684d (patch) | |
tree | c918998378da0d583bf7a716ff10144fc392366b /Modules/signalmodule.c | |
parent | 938ece71527203bf0cc43283e531e21da2f1de35 (diff) | |
download | cpython-8d46e4267ceb92409ff86f6e7094ee196d5e684d.zip cpython-8d46e4267ceb92409ff86f6e7094ee196d5e684d.tar.gz cpython-8d46e4267ceb92409ff86f6e7094ee196d5e684d.tar.bz2 |
Merged revisions 86214 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r86214 | antoine.pitrou | 2010-11-05 20:47:27 +0100 (ven., 05 nov. 2010) | 4 lines
Issue #10311: The signal module now restores errno before returning from
its low-level signal handler. Patch by Hallvard B Furuseth.
........
Diffstat (limited to 'Modules/signalmodule.c')
-rw-r--r-- | Modules/signalmodule.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 1aa86f4..42d8dd8 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -166,16 +166,20 @@ checksignals_witharg(void * unused) static void signal_handler(int sig_num) { -#ifdef WITH_THREAD -#ifdef WITH_PTH + int save_errno = errno; + +#if defined(WITH_THREAD) && defined(WITH_PTH) if (PyThread_get_thread_ident() != main_thread) { pth_raise(*(pth_t *) main_thread, sig_num); - return; } + else #endif + { +#ifdef WITH_THREAD /* See NOTES section above */ - if (getpid() == main_pid) { + if (getpid() == main_pid) #endif + { Handlers[sig_num].tripped = 1; /* Set is_tripped after setting .tripped, as it gets cleared in PyErr_CheckSignals() before .tripped. */ @@ -183,24 +187,26 @@ signal_handler(int sig_num) Py_AddPendingCall(checksignals_witharg, NULL); if (wakeup_fd != -1) write(wakeup_fd, "\0", 1); -#ifdef WITH_THREAD } -#endif + +#ifndef HAVE_SIGACTION #ifdef SIGCHLD - if (sig_num == SIGCHLD) { - /* To avoid infinite recursion, this signal remains - reset until explicit re-instated. - Don't clear the 'func' field as it is our pointer - to the Python handler... */ - return; - } + /* To avoid infinite recursion, this signal remains + reset until explicit re-instated. + Don't clear the 'func' field as it is our pointer + to the Python handler... */ + if (sig_num != SIGCHLD) #endif -#ifndef HAVE_SIGACTION /* If the handler was not set up with sigaction, reinstall it. See * Python/pythonrun.c for the implementation of PyOS_setsig which * makes this true. See also issue8354. */ PyOS_setsig(sig_num, signal_handler); #endif + } + + /* Issue #10311: asynchronously executing signal handlers should not + mutate errno under the feet of unsuspecting C code. */ + errno = save_errno; } |