You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
os.execvpe() doesn't support surrogates in env #52638
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2010-04-23.21:45:07.683>created_at=<Date2010-04-14.00:01:36.067>labels= ['library', 'expert-unicode']
title="os.execvpe() doesn't support surrogates in env"updated_at=<Date2010-04-25.22:40:52.782>user='https://github.com/vstinner'
It would be nice to support the PEP-383 (surrogateescape) for environment variables in os.execvpe(). Attached patch uses PyUnicode_AsEncodedString(val, Py_FileSystemDefaultEncoding, "surrogateescape") to encode an environment variable value.
I'm not sure that PyUnicode_AsEncodedString(val, Py_FileSystemDefaultEncoding, "surrogateescape") does always return a PyBytes object.
I not patched environment keys, but it might be useful.
Other notes: Environment variable *names* use also surrogateescape "encoding". os.spawnve() and os.spawnvpe() should also be patched (the code should also be factorized).
factorize code between execve(), spawnve() and spawnvpe()
support also surrogates in environment variable names
support bytes and bytearray (bytearray cannot be used as a dictionary key, but my patch supports it)
remove unrelated fix (my first patch contains a fix for os.system(), also about surrogates)
Because of the factorization, the error messages doesn't contain the function name anymore. spawnve() and spawnvpe() omit BEGINLIBPATH and ENDLIBPATH, as execve(): "that Would Confuse Programs if Passed On". I suppose that if execve() ignore them, spawn*e() should also ignore them.
I don't have an OS/2, so I'm unable to test my patch on this OS :-/
Note: The patch fixes also subprocess to support bytes and bytearray in the environment dictionary.
Current code of execve() has a bug: it uses the length of the environment variable value in *characters* and not in *bytes* to allocate the "p" buffer. I remember that someone wrote a comment somewhere about that... The result is that the environment variable value is truncated by 1 byte.
I blocked the fix in Python 3.1 because it's non trivial and I prefer to avoid complex changes in Python 3.1. But then I realized that Python 3.1 has two bugs about environment variables.
It uses sys.getfilesystemencoding()+surrogateecape to decode variables and sys.getdefaultencoding()+strict to encode variables: the encoding is different!
It counts the number of *characters* to allocate the *byte* string buffer and so non-ASCII values are truncated.
Activity
vstinner commentedon Apr 14, 2010
It would be nice to support the PEP-383 (surrogateescape) for environment variables in os.execvpe(). Attached patch uses PyUnicode_AsEncodedString(val, Py_FileSystemDefaultEncoding, "surrogateescape") to encode an environment variable value.
I'm not sure that PyUnicode_AsEncodedString(val, Py_FileSystemDefaultEncoding, "surrogateescape") does always return a PyBytes object.
I not patched environment keys, but it might be useful.
vstinner commentedon Apr 14, 2010
See also issue bpo-4036.
vstinner commentedon Apr 14, 2010
See also bpo-8393.
vstinner commentedon Apr 16, 2010
My patch doesn't work for types bytes and bytearray.
I noticed that py3k uses surrogateescape to encode environment variable values ;-)
vstinner commentedon Apr 16, 2010
Other notes: Environment variable *names* use also surrogateescape "encoding". os.spawnve() and os.spawnvpe() should also be patched (the code should also be factorized).
vstinner commentedon Apr 16, 2010
New version of the patch:
Because of the factorization, the error messages doesn't contain the function name anymore. spawnve() and spawnvpe() omit BEGINLIBPATH and ENDLIBPATH, as execve(): "that Would Confuse Programs if Passed On". I suppose that if execve() ignore them, spawn*e() should also ignore them.
I don't have an OS/2, so I'm unable to test my patch on this OS :-/
Note: The patch fixes also subprocess to support bytes and bytearray in the environment dictionary.
vstinner commentedon Apr 18, 2010
Current code of execve() has a bug: it uses the length of the environment variable value in *characters* and not in *bytes* to allocate the "p" buffer. I remember that someone wrote a comment somewhere about that... The result is that the environment variable value is truncated by 1 byte.
Example (copy of http://dpaste.com/184803/):
-----------
declare -p VAR
$ python2.6 test.py
declare -x VAR="ćd"
$ python3.1 test.py
declare -x VAR="ć"
-----------
vstinner commentedon Apr 23, 2010
Commited: r80421 (py3k), blocked in 3.1 (80422). The commit fixes also os.getenv() to support bytes environment name.
vstinner commentedon Apr 25, 2010
I blocked the fix in Python 3.1 because it's non trivial and I prefer to avoid complex changes in Python 3.1. But then I realized that Python 3.1 has two bugs about environment variables.
It uses sys.getfilesystemencoding()+surrogateecape to decode variables and sys.getdefaultencoding()+strict to encode variables: the encoding is different!
It counts the number of *characters* to allocate the *byte* string buffer and so non-ASCII values are truncated.
So I decided to backport the fix: r80494.