Author: Brian Kearns <[email protected]>
Branch: stdlib-2.7.4
Changeset: r63174:172b279b88eb
Date: 2013-04-09 17:28 -0400
http://bitbucket.org/pypy/pypy/changeset/172b279b88eb/

Log:    verify fd in signal.set_wakeup_fd (cpython issue16992)

diff --git a/pypy/module/signal/interp_signal.py 
b/pypy/module/signal/interp_signal.py
--- a/pypy/module/signal/interp_signal.py
+++ b/pypy/module/signal/interp_signal.py
@@ -2,6 +2,8 @@
 
 import signal as cpy_signal
 import sys
+import os
+import errno
 
 from pypy.interpreter.error import OperationError, exception_from_errno
 from pypy.interpreter.executioncontext import (AsyncAction, AbstractActionFlag,
@@ -236,6 +238,12 @@
             space.w_ValueError,
             space.wrap("set_wakeup_fd only works in main thread "
                        "or with __pypy__.thread.enable_signals()"))
+    if fd != -1:
+        try:
+            os.fstat(fd)
+        except OSError, e:
+            if e.errno == errno.EBADF:
+                raise OperationError(space.w_ValueError, space.wrap("invalid 
fd"))
     old_fd = pypysig_set_wakeup_fd(fd)
     return space.wrap(intmask(old_fd))
 
diff --git a/pypy/module/signal/test/test_signal.py 
b/pypy/module/signal/test/test_signal.py
--- a/pypy/module/signal/test/test_signal.py
+++ b/pypy/module/signal/test/test_signal.py
@@ -41,6 +41,8 @@
 
     def setup_class(cls):
         cls.w_signal = cls.space.getbuiltinmodule('signal')
+        cls.w_temppath = cls.space.wrap(
+            str(py.test.ensuretemp("signal").join("foo.txt")))
 
     def test_exported_names(self):
         import os
@@ -217,6 +219,12 @@
         #
         signal.signal(signal.SIGINT, signal.SIG_DFL)
 
+    def test_set_wakeup_fd_invalid(self):
+        import signal
+        with open(self.temppath, 'wb') as f:
+            fd = f.fileno()
+        raises(ValueError, signal.set_wakeup_fd, fd)
+
     def test_siginterrupt(self):
         import signal, os, time
         if not hasattr(signal, 'siginterrupt'):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to