New submission from STINNER Victor <victor.stin...@haypocalc.com>:

If the script filename is not decodable from the filesystem encoding, Python 
fails with a UnicodeEncodeError when we reach the recursion limit. The problem 
doesn't come from the user script, but from Python internals. It is difficult 
to understand and the user expects a 


A longer explanation:

test_runpy fails with a pydebug build if the script filename is not encodable 
to UTF-8. In pydebug build only, PyEval_EvalFrameEx() encodes the frame 
filename to UTF-8. If the filename contains a surrogate character (which only 
occurs on UNIX with undecodable filename),the encoding function fails. 
PyEval_EvalFrameEx() ignores the error except if we hit the recusion limit (if 
the overflowed attribute of the thread state if set): in this case, the error 
is not ignored.

To reproduce the problem, change the Python directory (your local repository) 
to an undecodable filename (eg. b'py3k\xe9\xff' with UTF-8 locale encoding) and 
run: ./python Lib/test/regrtest.py test_py.


Solutions :

I propose to remove the filename variable from PyEval_EvalFrameEx() because it 
is only used by the old gdb macros: python-gdb.py doesn't need it anymore.

=> see attached patch

Or if you really want to keep it, tstate->overflowed should be reinitialized. 
But on overflow, other variables are changed, like _Py_CheckRecursionLimit. I 
don't know this code enough to write a correct patch, but the minimal patch is:

--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1234,7 +1234,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
         filename = _PyUnicode_AsString(co->co_filename);
         if (filename == NULL && tstate->overflowed) {
             /* maximum recursion depth exceeded */
-            goto exit_eval_frame;
+            tstate->overflowed = 0;
         }
         PyErr_Restore(error_type, error_value, error_traceback);
     }

----------
components: Unicode
files: ceval_filename.patch
keywords: patch
messages: 128285
nosy: haypo
priority: normal
severity: normal
status: open
title: UnicodeEncodeError on recusion limit if the script filename is 
undecodable
versions: Python 3.2, Python 3.3
Added file: http://bugs.python.org/file20728/ceval_filename.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue11168>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to