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