Author: Amaury Forgeot d'Arc <[email protected]>
Branch:
Changeset: r56646:bf9ddd840ef3
Date: 2012-08-08 02:41 +0200
http://bitbucket.org/pypy/pypy/changeset/bf9ddd840ef3/
Log: Don't crash in imp.load_module() when the given path is not a real
file name. Use os.fstat() on the opened file instead.
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -602,8 +602,10 @@
try:
if find_info.modtype == PY_SOURCE:
- load_source_module(space, w_modulename, w_mod,
find_info.filename,
- find_info.stream.readall())
+ load_source_module(
+ space, w_modulename, w_mod,
+ find_info.filename, find_info.stream.readall(),
+ find_info.stream.try_to_find_file_descriptor())
return w_mod
elif find_info.modtype == PY_COMPILED:
magic = _r_long(find_info.stream)
@@ -878,7 +880,7 @@
@jit.dont_look_inside
-def load_source_module(space, w_modulename, w_mod, pathname, source,
+def load_source_module(space, w_modulename, w_mod, pathname, source, fd,
write_pyc=True):
"""
Load a source module from a given file and return its module
@@ -887,8 +889,8 @@
w = space.wrap
if space.config.objspace.usepycfiles:
+ src_stat = os.fstat(fd)
cpathname = pathname + 'c'
- src_stat = os.stat(pathname)
mtime = int(src_stat[stat.ST_MTIME])
mode = src_stat[stat.ST_MODE]
stream = check_compiled_module(space, cpathname, mtime)
diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py
--- a/pypy/module/imp/interp_imp.py
+++ b/pypy/module/imp/interp_imp.py
@@ -101,7 +101,8 @@
importing._prepare_module(space, w_mod, filename, None)
importing.load_source_module(
- space, w_modulename, w_mod, filename, stream.readall())
+ space, w_modulename, w_mod,
+ filename, stream.readall(), stream.try_to_find_file_descriptor())
if space.is_w(w_file, space.w_None):
stream.close()
return w_mod
diff --git a/pypy/module/imp/test/test_import.py
b/pypy/module/imp/test/test_import.py
--- a/pypy/module/imp/test/test_import.py
+++ b/pypy/module/imp/test/test_import.py
@@ -104,11 +104,10 @@
filename = str(p.join("x.py"))
stream = streamio.open_file_as_stream(filename, "r")
try:
- importing.load_source_module(space,
- w_modname,
- w(importing.Module(space, w_modname)),
- filename,
- stream.readall())
+ importing.load_source_module(
+ space, w_modname, w(importing.Module(space, w_modname)),
+ filename, stream.readall(),
+ stream.try_to_find_file_descriptor())
finally:
stream.close()
if space.config.objspace.usepycfiles:
@@ -618,6 +617,19 @@
sys.path.insert(0, sys.path.pop())
del sys.modules['itertools']
+ def test_invalid_pathname(self):
+ import imp
+ import pkg
+ import os
+
+ info = ('.py', 'r', imp.PY_SOURCE)
+ pathname = os.path.join(os.path.dirname(pkg.__file__), 'a.py')
+
+ module = imp.load_module('a', open(pathname),
+ 'invalid_path_name', ('.py', 'r',
imp.PY_SOURCE))
+ assert module.__name__ == 'a'
+ assert module.__file__ == 'invalid_path_name'
+
class TestAbi:
def test_abi_tag(self):
@@ -783,11 +795,10 @@
pathname = _testfilesource()
stream = streamio.open_file_as_stream(pathname, "r")
try:
- w_ret = importing.load_source_module(space,
- w_modulename,
- w_mod,
- pathname,
- stream.readall())
+ w_ret = importing.load_source_module(
+ space, w_modulename, w_mod,
+ pathname, stream.readall(),
+ stream.try_to_find_file_descriptor())
finally:
stream.close()
assert w_mod is w_ret
@@ -806,12 +817,11 @@
pathname = _testfilesource()
stream = streamio.open_file_as_stream(pathname, "r")
try:
- w_ret = importing.load_source_module(space,
- w_modulename,
- w_mod,
- pathname,
- stream.readall(),
- write_pyc=False)
+ w_ret = importing.load_source_module(
+ space, w_modulename, w_mod,
+ pathname, stream.readall(),
+ stream.try_to_find_file_descriptor(),
+ write_pyc=False)
finally:
stream.close()
cpathname = udir.join('test.pyc')
@@ -826,11 +836,10 @@
try:
space.setattr(space.sys, space.wrap('dont_write_bytecode'),
space.w_True)
- w_ret = importing.load_source_module(space,
- w_modulename,
- w_mod,
- pathname,
- stream.readall())
+ w_ret = importing.load_source_module(
+ space, w_modulename, w_mod,
+ pathname, stream.readall(),
+ stream.try_to_find_file_descriptor())
finally:
space.setattr(space.sys, space.wrap('dont_write_bytecode'),
space.w_False)
@@ -846,11 +855,10 @@
pathname = _testfilesource(source="<Syntax Error>")
stream = streamio.open_file_as_stream(pathname, "r")
try:
- w_ret = importing.load_source_module(space,
- w_modulename,
- w_mod,
- pathname,
- stream.readall())
+ w_ret = importing.load_source_module(
+ space, w_modulename, w_mod,
+ pathname, stream.readall(),
+ stream.try_to_find_file_descriptor())
except OperationError:
# OperationError("Syntax Error")
pass
@@ -867,11 +875,10 @@
pathname = _testfilesource(source="a = unknown_name")
stream = streamio.open_file_as_stream(pathname, "r")
try:
- w_ret = importing.load_source_module(space,
- w_modulename,
- w_mod,
- pathname,
- stream.readall())
+ w_ret = importing.load_source_module(
+ space, w_modulename, w_mod,
+ pathname, stream.readall(),
+ stream.try_to_find_file_descriptor())
except OperationError:
# OperationError("NameError", "global name 'unknown_name' is not
defined")
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit