In a threads-disabled build, typing Ctrl-C into a raw_input() crashed,

because (essentially) I didn't realise that PY_BEGIN/END_ALLOW_THREADS
actually expanded to nothing under a no-threads build, so if you somehow
NULLed out the threadstate (e.g. by calling PyThread_SaveThread) it would
stay NULLed when you return to Python.  Argh!

Backport candidate.
This commit is contained in:
Michael W. Hudson 2005-04-07 10:11:19 +00:00
parent ad351f806d
commit e3afc598bc
3 changed files with 11 additions and 0 deletions

View File

@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Typing Ctrl-C whilst raw_input() was waiting in a build with threads
disabled caused a crash.
- Bug #1165306: instancemethod_new allowed the creation of a method - Bug #1165306: instancemethod_new allowed the creation of a method
with im_class == im_self == NULL, which caused a crash when called. with im_class == im_self == NULL, which caused a crash when called.

View File

@ -775,9 +775,13 @@ readline_until_enter_or_signal(char *prompt, int *signal)
} }
else if (errno == EINTR) { else if (errno == EINTR) {
int s; int s;
#ifdef WITH_THREAD
PyEval_RestoreThread(_PyOS_ReadlineTState); PyEval_RestoreThread(_PyOS_ReadlineTState);
#endif
s = PyErr_CheckSignals(); s = PyErr_CheckSignals();
#ifdef WITH_THREAD
PyEval_SaveThread(); PyEval_SaveThread();
#endif
if (s < 0) { if (s < 0) {
rl_free_line_state(); rl_free_line_state();
rl_cleanup_after_signal(); rl_cleanup_after_signal();

View File

@ -82,9 +82,13 @@ my_fgets(char *buf, int len, FILE *fp)
#ifdef EINTR #ifdef EINTR
if (errno == EINTR) { if (errno == EINTR) {
int s; int s;
#ifdef WITH_THREAD
PyEval_RestoreThread(_PyOS_ReadlineTState); PyEval_RestoreThread(_PyOS_ReadlineTState);
#endif
s = PyErr_CheckSignals(); s = PyErr_CheckSignals();
#ifdef WITH_THREAD
PyEval_SaveThread(); PyEval_SaveThread();
#endif
if (s < 0) { if (s < 0) {
return 1; return 1;
} }