classification
Title: Infinite loop in PyRun_InteractiveLoopFlags() if PyRun_InteractiveOneFlags() raises an error
Type: crash Stage:
Components: Interpreter Core Versions: Python 3.3, Python 3.2, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: haypo, tlesher, ysj.ray
Priority: normal Keywords: patch

Created on 2010-03-05 12:50 by haypo, last changed 2012-03-13 02:30 by eric.araujo.

Files
File name Uploaded Description Edit
pyrun_interactive_loop-py3k.patch haypo, 2010-03-05 12:50
8070-use-default-encoding.patch tlesher, 2012-03-11 18:31 review
8070-use-default-encoding-2.patch tlesher, 2012-03-12 16:56 review
Messages (11)
msg100471 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2010-03-05 12:50
PyRun_InteractiveLoopFlags() only stops if PyRun_InteractiveOneFlags() returns E_EOF. But PyRun_InteractiveOneFlags() if an error occurs:
 - sys.stdin has no encoding attribute
 - PyArena_New() returns NULL
 - PyParser_ASTFromFile() returns NULL
 - PyImport_AddModule("__main__") returns NULL
 - run_mod() returns NULL

You can reproduce the error by adding the followg line to the end of Lib/site.py:

  sys.stdin = object()

Attached patch is for py3k, but the bug does also exist in trunk.
msg100473 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2010-03-05 12:55
PyRun_InteractiveLoop() doesn't specify the possible return value. It's maybe because it's always zero and that the error are not handled :-)
http://docs.python.org/c-api/veryhigh.html#PyRun_InteractiveLoop

PyRun_InteractiveOneFlags() documentation is also wrong: the result can only be: 0 (succes), -1 (exception raised) or E_EOF (=11, end of file).
msg102622 - (view) Author: Tim Lesher (tlesher) * Date: 2010-04-08 15:35
I just hit this one myself, and was about to write a bug and patch.

On reviewing the patch:

1. This really has the same issue as the original code: it detects one of a few known return values, and will infinitely loop on an unexpected return value.  It would be better to explicitly check for 0 (continue), E_EOF (exit normally), and any other result (exit abnormally).

2. I don't think you want to unconditionally call PyErr_Print(), because you don't know for sure that an exception is set.

3. Returning 0 from PyRun_InteractiveLoopFlags() when an error occurs is a behavior change, which makes its documentation incorrect (meaning there should also be a doc patch). But to be honest, I don't think it's correct to return 0 in this case. It seems better to return the actual error code (which also requires a doc patch)

If you don't have time to update the patch, let me know and I'll put one together.
msg102889 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2010-04-11 21:18
I don't have time to write a better patch, please improve mine :-)
msg106028 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2010-05-19 02:05
tlesher> If you don't have time to update the patch, let me know and I'll put one together.

I would be happy if you write a new patch :-)
msg132790 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2011-04-02 08:29
Issue #11730 has been marked as duplicate.
msg132791 - (view) Author: ysj.ray (ysj.ray) Date: 2011-04-02 08:43
I'd prefer not exit program but try to use Py_FileSystemDefaultEncoding as enc when sys.stdin is invalid. On most cases, setting sys.stdin to some other invalid value does means the program could not continue running.
msg132792 - (view) Author: ysj.ray (ysj.ray) Date: 2011-04-02 08:52
> On most cases, setting sys.stdin to some other invalid value does means the program could not continue running.


Sorry, it should be:

On most cases, setting sys.stdin to some other invalid value does not mean the program could not continue running.
msg155289 - (view) Author: Tim Lesher (tlesher) * Date: 2012-03-10 03:39
Victor: would you object to ysj.ray's solution? 

I don't think it was an option when we last looked at this issue.
msg155402 - (view) Author: Tim Lesher (tlesher) * Date: 2012-03-11 18:31
Updated patch:  use Py_FileSystemDefaultEncoding (if possible) when sys.stdin is (or becomes) invalid; if none, then fails without entering infinite loop. Docs for PyRun_InteractiveLoopFlags have been updated.
msg155455 - (view) Author: Tim Lesher (tlesher) * Date: 2012-03-12 16:56
Corrected const warning in previous patch.
History
Date User Action Args
2012-03-13 02:30:15eric.araujosetversions: + Python 3.3, - Python 2.6, Python 3.1
2012-03-12 16:56:22tleshersetfiles: + 8070-use-default-encoding-2.patch

messages: + msg155455
2012-03-11 18:31:56tleshersetfiles: + 8070-use-default-encoding.patch

messages: + msg155402
2012-03-10 03:39:12tleshersetmessages: + msg155289
2011-04-02 08:52:13ysj.raysetmessages: + msg132792
2011-04-02 08:43:04ysj.raysetmessages: + msg132791
2011-04-02 08:29:09hayposetmessages: + msg132790
2010-05-19 09:20:45ysj.raysetnosy: + ysj.ray
2010-05-19 02:05:27hayposetmessages: + msg106028
2010-04-11 21:18:04hayposetmessages: + msg102889
2010-04-08 15:35:09tleshersetnosy: + tlesher
messages: + msg102622
2010-03-05 12:55:32hayposetmessages: + msg100473
2010-03-05 12:50:18haypocreate