Subject: patches to python to fix PR 24797
To: None <tech-pkg@NetBSD.org, recht@NetBSD.org>
From: Luke Mewburn <lukem@NetBSD.org>
List: tech-pkg
Date: 06/10/2004 23:02:31
--4AmJdx/+JAF2YHMk
Content-Type: multipart/mixed; boundary="3WLtXmtPTeS+BWmV"
Content-Disposition: inline
--3WLtXmtPTeS+BWmV
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hi Marc (& the rest of tech-pkg)
I have discovered the problem behind the bug that I reported
in PR 24797.
The following patches work for python23-pth, but I'm not
sure the correct method to apply them given the way that
python23 is built (across multiple makefiles), so I offer
them here.
Note that these patches should also fix the bug for python 2.2
and python 2.1, but they'll probably need massaging to apply.
I've also attached a simple script that can reproduce the problem;
if you need to press ^C twice to raise KeyboardInterrupt the bug
is present; you should only need to press ^C once.
Cheers,
Luke.
--3WLtXmtPTeS+BWmV
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="pytest.py"
#!/usr/bin/env python
import sys
print "press ^C to exit. if buggy, you may need more than one"
l=sys.stdin.read()
--3WLtXmtPTeS+BWmV
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="python.fix"
Content-Transfer-Encoding: quoted-printable
--- Python/pythonrun.c.orig 2004-03-23 07:41:47.000000000 +1100
+++ Python/pythonrun.c
@@ -1581,13 +1581,13 @@ initsigs(void)
{
#ifdef HAVE_SIGNAL_H
#ifdef SIGPIPE
- signal(SIGPIPE, SIG_IGN);
+ PyOS_setsig(SIGPIPE, SIG_IGN);
#endif
#ifdef SIGXFZ
- signal(SIGXFZ, SIG_IGN);
+ PyOS_setsig(SIGXFZ, SIG_IGN);
#endif
#ifdef SIGXFSZ
- signal(SIGXFSZ, SIG_IGN);
+ PyOS_setsig(SIGXFSZ, SIG_IGN);
#endif
#endif /* HAVE_SIGNAL_H */
PyOS_InitInterrupts(); /* May imply initsignal() */
@@ -1684,20 +1684,19 @@ PyOS_sighandler_t
PyOS_setsig(int sig, PyOS_sighandler_t handler)
{
#ifdef HAVE_SIGACTION
- struct sigaction context;
- PyOS_sighandler_t oldhandler;
- /* Initialize context.sa_handler to SIG_ERR which makes about as
- * much sense as anything else. It should get overwritten if
- * sigaction actually succeeds and otherwise we avoid an
- * uninitialized memory read.
- */
- context.sa_handler =3D SIG_ERR;
- sigaction(sig, NULL, &context);
- oldhandler =3D context.sa_handler;
+ struct sigaction context, ocontext;
context.sa_handler =3D handler;
- sigaction(sig, &context, NULL);
- return oldhandler;
+ sigemptyset(&context.sa_mask);
+ context.sa_flags =3D 0;
+ if (sigaction(sig, &context, &ocontext) =3D=3D -1)
+ return SIG_ERR;
+ return ocontext.sa_handler;
#else
- return signal(sig, handler);
+ PyOS_sighandler_t oldhandler;
+ oldhandler =3D signal(sig, handler);
+#ifdef HAVE_SIGINTERRUPT
+ siginterrupt(sig, 1);
+#endif
+ return oldhandler;
#endif
}
--- Modules/signalmodule.c.orig 2003-03-14 00:56:53.000000000 +1100
+++ Modules/signalmodule.c
@@ -137,9 +137,6 @@ signal_handler(int sig_num)
return;
}
#endif
-#ifdef HAVE_SIGINTERRUPT
- siginterrupt(sig_num, 1);
-#endif
PyOS_setsig(sig_num, signal_handler);
}
=20
@@ -217,9 +214,6 @@ signal_signal(PyObject *self, PyObject *
}
else
func =3D signal_handler;
-#ifdef HAVE_SIGINTERRUPT
- siginterrupt(sig_num, 1);
-#endif
if (PyOS_setsig(sig_num, func) =3D=3D SIG_ERR) {
PyErr_SetFromErrno(PyExc_RuntimeError);
return NULL;
--3WLtXmtPTeS+BWmV--
--4AmJdx/+JAF2YHMk
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (NetBSD)
iD8DBQFAyFvnpBhtmn8zJHIRAqYqAJsEAzVKwgAQA/f5GFJELtvzYSvgbQCgkRb9
OjlI4cQEbgEZVxWUtq5AVIg=
=1+oI
-----END PGP SIGNATURE-----
--4AmJdx/+JAF2YHMk--