[pypy-issue] Issue #2005: RPython OSError if you os.close() the wrong fd (pypy/pypy)
Antonio Cuni
issues-reply at bitbucket.org
Fri Mar 20 16:20:37 CET 2015
New issue 2005: RPython OSError if you os.close() the wrong fd
https://bitbucket.org/pypy/pypy/issue/2005/rpython-oserror-if-you-osclose-the-wrong
Antonio Cuni:
Suppose to have the following bar.py and foo.py
```
#!python
# bar.py
import foo
# foo.py
import os
os.close(3) # fd 3 points to foo.py
```
On CPython, it works fine; on PyPy, it crashes:
```
$ pypy bar.py
RPython traceback:
File "pypy_goal_targetpypystandalone.c", line 2206, in entry_point
File "pypy_interpreter_pyframe.c", line 3185, in PyFrame_execute_frame
File "rpython_jit_metainterp_warmspot.c", line 1858, in ll_portal_runner__Unsigned_Bool_pypy_interpreter
File "pypy_module_pypyjit_interp_jit.c", line 289, in portal_5
File "pypy_interpreter_pyopcode.c", line 3468, in handle_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 7012, in dispatch_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 31276, in call_function__AccessDirect_None
File "pypy_interpreter_pyframe.c", line 3185, in PyFrame_execute_frame
File "rpython_jit_metainterp_warmspot.c", line 1858, in ll_portal_runner__Unsigned_Bool_pypy_interpreter
File "pypy_module_pypyjit_interp_jit.c", line 289, in portal_5
File "pypy_interpreter_pyopcode.c", line 3468, in handle_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 7050, in dispatch_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 31276, in call_function__AccessDirect_None
File "pypy_interpreter_pyframe.c", line 3185, in PyFrame_execute_frame
File "rpython_jit_metainterp_warmspot.c", line 1858, in ll_portal_runner__Unsigned_Bool_pypy_interpreter
File "pypy_module_pypyjit_interp_jit.c", line 289, in portal_5
File "pypy_interpreter_pyopcode.c", line 3468, in handle_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 7099, in dispatch_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 31276, in call_function__AccessDirect_None
File "pypy_interpreter_pyframe.c", line 3185, in PyFrame_execute_frame
File "rpython_jit_metainterp_warmspot.c", line 1858, in ll_portal_runner__Unsigned_Bool_pypy_interpreter
File "pypy_module_pypyjit_interp_jit.c", line 289, in portal_5
File "pypy_interpreter_pyopcode.c", line 3468, in handle_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 7995, in dispatch_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 21370, in EXEC_STMT__AccessDirect_None
File "pypy_interpreter_pyframe.c", line 3185, in PyFrame_execute_frame
File "rpython_jit_metainterp_warmspot.c", line 1858, in ll_portal_runner__Unsigned_Bool_pypy_interpreter
File "pypy_module_pypyjit_interp_jit.c", line 289, in portal_5
File "pypy_interpreter_pyopcode.c", line 3468, in handle_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 8067, in dispatch_bytecode__AccessDirect_None
File "pypy_interpreter_pyopcode.c", line 25276, in IMPORT_NAME__AccessDirect_None
File "pypy_interpreter_gateway.c", line 477, in BuiltinCode_funcrun_obj
File "pypy_interpreter_gateway.c", line 2582, in BuiltinCode_handle_exception
Fatal RPython error: OSError
Aborted
```
This is probably caused by this code in module/imp/importing.py, inside load_part:
```
#!python
try:
if find_info:
w_mod = load_module(space, w_modulename, find_info)
[cut]
finally:
if find_info:
stream = find_info.stream
if stream:
stream.close()
```
The stream.close() in the finally fails (because the fd has already been closed), but it's not caugth by anyone, and thus crashes the interpreter.
Note that importing.py is full of stream.close() all around the place, so we probably need to think of a general solution for the problem.
More information about the pypy-issue
mailing list