Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [BUG] Unicode variables can be exported and are exported metafied
20.12.2014, 00:54, "Peter Stephenson" <p.w.stephenson@xxxxxxxxxxxx>:
> On Fri, 19 Dec 2014 19:17:37 +0100
> "Christoph (Stucki) von Stuckrad" <stucki@xxxxxxxxxxxxxxx> wrote:
>> On Thu, 18 Dec 2014, Bart Schaefer wrote:
>>> Are we sure it's even "legal" to export Unicode variable names?
>>> Internally we can kinda ignore POSIX as we choose, but the
>>> environment crosses those boundaries.
>> Independend of being 'legal' to me it seems dangerous!
>
> Well, this seems to be controversial. But it's not clear how useful such
> variables are anyway.
>
> This backs off yesterday's mess and ignores environment variable names
> with characters with the top bit set. We'll see if anyone trips over it.
According to
> "Other characters may be permitted by an implementation; applications
> shall tolerate the presence of such names."
> … shall tolerate …
such environment variables can be used for testing software for standard conformance.
I think though that for such testing `env` is more likely to be used because zsh support for such environment variables is not only locale-dependent, but also restricted to whatever libc thinks is alphanumeric character:
zyx ~ env «»=10 python -c 'import os; print(os.environ["«»"])'
10
zyx ~ «»=10 python -c 'import os; print(os.environ["«»"])'
zsh: command not found: «»=10
(something weird like `$'\n'` also works as an “environment variable name” for `env`).
---
By the way, support status for shells found on my system:
code:
абв=1 $SHELL -c 'echo $абв'
tcsh: Illegal variable name
ksh: echoes 1
mksh: echoes $абв
fish: echoes 1
busybox with ash: echoes $абв
busybox with hush (commit ad0d009e0c1968a14f17189264d3aa8008ea2e3b): echoes $абв
rcsh: syntax error near (decimal -48)
bash: echoes $абв
dash: echoes $абв
zsh: echoes 1
абв=1 $SHELL /c 'echo %абв%'
wine cmd.exe: echoes ^[[?1h^[=1 followed by CRNL
Summary:
Syntax error: tcsh, rcsh
$абв: mksh, busybox ash, busybox hush, bash, dash
1: ksh, fish, zsh, wine cmd.exe
>
> pws
>
> diff --git a/Src/params.c b/Src/params.c
> index 1c51afd..b8e0c42 100644
> --- a/Src/params.c
> +++ b/Src/params.c
> @@ -641,9 +641,17 @@ split_env_string(char *env, char **name, char **value)
> if (!env || !name || !value)
> return 0;
>
> - tenv = metafy(env, strlen(env), META_HEAPDUP);
> - for (str = tenv; *str && *str != '='; str++)
> - ;
> + tenv = strcpy(zhalloc(strlen(env) + 1), env);
> + for (str = tenv; *str && *str != '='; str++) {
> + if (STOUC(*str) >= 128) {
> + /*
> + * We'll ignore environment variables with names not
> + * from the portable character set since we don't
> + * know of a good reason to accept them.
> + */
> + return 0;
> + }
> + }
> if (str != tenv && *str == '=') {
> *str = '\0';
> *name = tenv;
> @@ -4357,18 +4365,7 @@ arrfixenv(char *s, char **t)
> int
> zputenv(char *str)
> {
> - char *ptr;
> DPUTS(!str, "Attempt to put null string into environment.");
> - /*
> - * The environment uses NULL-terminated strings, so just
> - * unmetafy and ignore the length.
> - */
> - for (ptr = str; *ptr && *ptr != Meta; ptr++)
> - ;
> - if (*ptr == Meta) {
> - str = dupstring(str);
> - unmetafy(str, NULL);
> - }
> #ifdef USE_SET_UNSET_ENV
> /*
> * If we are using unsetenv() to remove values from the
> @@ -4377,11 +4374,21 @@ zputenv(char *str)
> * Unfortunately this is a slightly different interface
> * from what zputenv() assumes.
> */
> + char *ptr;
> int ret;
>
> - for (ptr = str; *ptr && *ptr != '='; ptr++)
> + for (ptr = str; *ptr && STOUC(*ptr) < 128 && *ptr != '='; ptr++)
> ;
> - if (*ptr) {
> + if (STOUC(*ptr) >= 128) {
> + /*
> + * Environment variables not in the portable character
> + * set are non-standard and we don't really know of
> + * a use for them.
> + *
> + * We'll disable until someone complains.
> + */
> + return 1;
> + } else if (*ptr) {
> *ptr = '\0';
> ret = setenv(str, ptr+1, 1);
> *ptr = '=';
Messages sorted by:
Reverse Date,
Date,
Thread,
Author