[pypy-commit] pypy default: test/fix check for directory in rfile open

bdkearns noreply at buildbot.pypy.org
Fri Aug 29 07:20:14 CEST 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r73151:8986be62c395
Date: 2014-08-29 01:17 -0400
http://bitbucket.org/pypy/pypy/changeset/8986be62c395/

Log:	test/fix check for directory in rfile open

diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -3,7 +3,7 @@
 python builtin open()
 """
 
-import os
+import os, stat, errno
 from rpython.rlib import rposix
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib.rstring import StringBuilder
@@ -79,9 +79,20 @@
 
 
 def _error(ll_file):
-    errno = c_ferror(ll_file)
+    err = c_ferror(ll_file)
     c_clearerr(ll_file)
-    raise OSError(errno, os.strerror(errno))
+    raise OSError(err, os.strerror(err))
+
+
+def _dircheck(ll_file):
+    try:
+        st = os.fstat(c_fileno(ll_file))
+    except OSError:
+        pass
+    else:
+        if stat.S_ISDIR(st[0]):
+            err = errno.EISDIR
+            raise OSError(err, os.strerror(err))
 
 
 def create_file(filename, mode="r", buffering=-1):
@@ -97,6 +108,7 @@
             lltype.free(ll_mode, flavor='raw')
     finally:
         lltype.free(ll_name, flavor='raw')
+    _dircheck(ll_f)
     if buffering >= 0:
         if buffering == 0:
             c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IONBF, 0)
@@ -124,6 +136,7 @@
             raise OSError(errno, os.strerror(errno))
     finally:
         lltype.free(ll_mode, flavor='raw')
+    _dircheck(ll_f)
     return RFile(ll_f)
 
 
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
@@ -1,4 +1,4 @@
-import os, sys, py
+import os, sys, py, errno
 from rpython.rtyper.test.tool import BaseRtypingTest
 from rpython.tool.udir import udir
 from rpython.rlib import rfile
@@ -17,9 +17,37 @@
             f.write("dupa")
             f.close()
 
+        f()
         self.interpret(f, [])
         assert open(fname, "r").read() == "dupa"
 
+    def test_open_errors(self):
+        def f():
+            try:
+                open('zzz')
+            except OSError as e:
+                assert e.errno == errno.ENOENT
+            else:
+                assert False
+
+            try:
+                open('.')
+            except OSError as e:
+                assert e.errno == errno.EISDIR
+            else:
+                assert False
+
+            fd = os.open('.', os.O_RDONLY, 0777)
+            try:
+                os.fdopen(fd)
+            except OSError as e:
+                assert e.errno == errno.EISDIR
+            else:
+                assert False
+            os.close(fd)
+
+        self.interpret(f, [])
+
     def test_open_buffering_line(self):
         fname = str(self.tmpdir.join('file_1a'))
 


More information about the pypy-commit mailing list