[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