Author: Brian Kearns <[email protected]>
Branch: use-file-star-for-file
Changeset: r73508:9cc506ff40ab
Date: 2014-09-12 11:42 -0400
http://bitbucket.org/pypy/pypy/changeset/9cc506ff40ab/

Log:    do proper error handling in getline_fgets

diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -445,6 +445,14 @@
 
         result = c_fgets(raw_buf, BASE_LINE_SIZE, ll_file)
         if not result:
+            if c_ferror(ll_file):
+                if rposix.get_errno() == errno.EINTR:
+                    if self._signal_checker is not None:
+                        self._signal_checker()
+                    c_clearerr(ll_file)
+                    return -1
+                c_clearerr(ll_file)
+                raise _from_errno(IOError)
             c_clearerr(ll_file)
             if self._signal_checker is not None:
                 self._signal_checker()
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -307,6 +307,28 @@
             f2.write("xxx")
             f2.close()
 
+            fd = os.open(fname, os.O_RDONLY, 0777)
+            f = os.fdopen(fd, 'r')
+            os.close(fd)
+            try:
+                f.read()
+            except IOError as e:
+                pass
+            else:
+                assert False
+            try:
+                f.readline()
+            except IOError as e:
+                pass
+            else:
+                assert False
+            try:
+                f.close()
+            except IOError as e:
+                pass
+            else:
+                assert False
+
         f()
         assert open(fname).read() == "xxx"
         self.interpret(f, [])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to