[pypy-commit] pypy win32-cleanup2: validate fp by using os.read in fread

mattip noreply at buildbot.pypy.org
Fri Mar 30 13:22:14 CEST 2012


Author: Matti Picus <matti.picus at gmail.com>
Branch: win32-cleanup2
Changeset: r54101:537c9b127d8f
Date: 2012-03-30 14:19 +0300
http://bitbucket.org/pypy/pypy/changeset/537c9b127d8f/

Log:	validate fp by using os.read in fread

diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -79,8 +79,16 @@
 
 # FILE* interface
 FILEP = rffi.COpaquePtr('FILE')
+
 fopen = rffi.llexternal('fopen', [CONST_STRING, CONST_STRING], FILEP)
-fclose = rffi.llexternal('fclose', [FILEP], rffi.INT)
+#fclose = rffi.llexternal('fclose', [FILEP], rffi.INT)
+def fclose(fp):
+    try:
+        fd = fileno(fp)
+        return os.close(fd)
+    except:
+        return -1
+
 fwrite = rffi.llexternal('fwrite',
                          [rffi.VOIDP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
                          rffi.SIZE_T)
diff --git a/pypy/module/cpyext/eval.py b/pypy/module/cpyext/eval.py
--- a/pypy/module/cpyext/eval.py
+++ b/pypy/module/cpyext/eval.py
@@ -2,13 +2,15 @@
 from pypy.interpreter.astcompiler import consts
 from pypy.rpython.lltypesystem import rffi, lltype
 from pypy.module.cpyext.api import (
-    cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, fread, feof, Py_ssize_tP,
+    cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, fileno, feof, Py_ssize_tP,
     cpython_struct)
 from pypy.module.cpyext.pyobject import PyObject, borrow_from
 from pypy.module.cpyext.pyerrors import PyErr_SetFromErrno
 from pypy.module.cpyext.funcobject import PyCodeObject
 from pypy.module.__builtin__ import compiling
 
+import os
+
 PyCompilerFlags = cpython_struct(
     "PyCompilerFlags", (("cf_flags", rffi.INT),))
 PyCompilerFlagsPtr = lltype.Ptr(PyCompilerFlags)
@@ -152,19 +154,23 @@
     closeit set to 0 and flags set to NULL."""
     BUF_SIZE = 8192
     source = ""
+    try:
+        fd = fileno(fp)
+        count = os.fstat(fd).st_size
+        while len(source) < count:
+            buf = os.read(fd, BUF_SIZE)
+            source += buf
+            if len(buf) < BUF_SIZE:
+                break
+        else:
+            PyErr_SetFromErrno(space, space.w_IOError)
+    except:
+        PyErr_SetFromErrno(space, space.w_IOError)
+        return None
+    finally:
+        pass
+        #lltype.free(buf, flavor='raw')
     filename = rffi.charp2str(filename)
-    buf = lltype.malloc(rffi.CCHARP.TO, BUF_SIZE, flavor='raw')
-    try:
-        while True:
-            count = fread(buf, 1, BUF_SIZE, fp)
-            count = rffi.cast(lltype.Signed, count)
-            source += rffi.charpsize2str(buf, count)
-            if count < BUF_SIZE:
-                if feof(fp):
-                    break
-                PyErr_SetFromErrno(space, space.w_IOError)
-    finally:
-        lltype.free(buf, flavor='raw')
     return run_string(space, source, filename, start, w_globals, w_locals)
 
 # Undocumented function!


More information about the pypy-commit mailing list