From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 3 Feb 2022 23:32:22 +0000 (-0800) Subject: bpo-14916: use specified tokenizer fd for file input (GH-31006) X-Git-Tag: v3.10.3~129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=91e888904478271c27c52c773863b41f5a8f7f30;p=thirdparty%2FPython%2Fcpython.git bpo-14916: use specified tokenizer fd for file input (GH-31006) @pablogsal, sorry i failed to rebase to main, so i recreated https://github.com/python/cpython/pull/22190GH-issuecomment-1024633392 > PyRun_InteractiveOne\*() functions allow to explicitily set fd instead of stdin. but stdin was hardcoded in readline call. > This patch does not fix target file for prompt unlike original bpo one : prompt fd is unrelated to tokenizer source which could be read only. It is more of a bugfix regarding the docs : actual documentation say "prompt the user" so one would expect prompt to go on stdout not a file for both PyRun_InteractiveOne\*() and PyRun_InteractiveLoop\*(). Automerge-Triggered-By: GH:pablogsal (cherry picked from commit 89b13042fcfc95bae21a49806a205ef62f1cdd73) Co-authored-by: Paul m. p. P --- diff --git a/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst b/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst new file mode 100644 index 000000000000..885cfc53aba3 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst @@ -0,0 +1 @@ +Fixed bug in the tokenizer that prevented ``PyRun_InteractiveOne`` from parsing from the provided FD. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index de5f57649c25..3738a9021fcd 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -854,7 +854,7 @@ tok_underflow_interactive(struct tok_state *tok) { tok->done = E_INTERACT_STOP; return 1; } - char *newtok = PyOS_Readline(stdin, stdout, tok->prompt); + char *newtok = PyOS_Readline(tok->fp ? tok->fp : stdin, stdout, tok->prompt); if (newtok != NULL) { char *translated = translate_newlines(newtok, 0, tok); PyMem_Free(newtok);