[Python-checkins] cpython: Issue #22018: signal.set_wakeup_fd() now raises an OSError instead of a

victor.stinner python-checkins at python.org
Mon Jul 21 16:30:23 CEST 2014


http://hg.python.org/cpython/rev/42cf963e3ab1
changeset:   91745:42cf963e3ab1
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Mon Jul 21 16:28:54 2014 +0200
summary:
  Issue #22018: signal.set_wakeup_fd() now raises an OSError instead of a
ValueError on fstat() failure.

files:
  Lib/test/test_signal.py |   6 +++---
  Misc/NEWS               |   3 +++
  Modules/signalmodule.c  |  14 +++++++++++---
  3 files changed, 17 insertions(+), 6 deletions(-)


diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -252,14 +252,14 @@
 
     def test_invalid_fd(self):
         fd = support.make_bad_fd()
-        self.assertRaises(ValueError, signal.set_wakeup_fd, fd)
+        self.assertRaises(OSError, signal.set_wakeup_fd, fd)
 
     def test_set_wakeup_fd_result(self):
         r1, w1 = os.pipe()
-        os.close(r1)
+        self.addCleanup(os.close, r1)
         self.addCleanup(os.close, w1)
         r2, w2 = os.pipe()
-        os.close(r2)
+        self.addCleanup(os.close, r2)
         self.addCleanup(os.close, w2)
 
         signal.set_wakeup_fd(w1)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -108,6 +108,9 @@
 Library
 -------
 
+- Issue #22018: signal.set_wakeup_fd() now raises an OSError instead of a
+  ValueError on ``fstat()`` failure.
+
 - Issue #21044: tarfile.open() now handles fileobj with an integer 'name'
   attribute.  Based on patch by Martin Panter.
 
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -437,12 +437,20 @@
         return NULL;
     }
 #endif
-    if (fd != -1 && (!_PyVerify_fd(fd) || fstat(fd, &buf) != 0)) {
-        PyErr_SetString(PyExc_ValueError, "invalid fd");
-        return NULL;
+
+    if (fd != -1) {
+        if (!_PyVerify_fd(fd)) {
+            PyErr_SetString(PyExc_ValueError, "invalid fd");
+            return NULL;
+        }
+
+        if (fstat(fd, &buf) != 0)
+            return PyErr_SetFromErrno(PyExc_OSError);
     }
+
     old_fd = wakeup_fd;
     wakeup_fd = fd;
+
     return PyLong_FromLong(old_fd);
 }
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list