On 2/21/21 11:04 AM, Vadim Zhukov wrote:
> Hello all.
>
> This continues the 'Another potential ksh bug?' thread on misc@:
> https://marc.info/?l=openbsd-misc&m=160736700220621&w=2
> This present is a bit too late for Christmas, but at least the Day of
> Red Army is coming soon. I'm sure noone is against this patch then.
>
> The code in typeset() function, which is responsible for almost all
> shell variable tweaking, contains a bug: in case of array it passes
> "foo=var" instead of only variable name ("foo"), if the value was
> ever given. This results in, e.g., a bug reported by Jordan Geoghegan.
> Generally speaking, we had creating a (temporary) variable via global()
> in vpbase, and of course it didn't get the read-only marker.
>
> This fix is to use 'tvar' variable, which always contains shell
> variable name, without value.
>
> As a bonus, this fixes the ifs.t:IFS-null-1 test (previously failing).
> I'm too lazy to check why. :-)
>
> Okay anyone?
>
> --
> WBR,
>   Vadim Zhukov
>
>
> Index: regress/bin/ksh/obsd-regress.t
> ===================================================================
> RCS file: /cvs/src/regress/bin/ksh/obsd-regress.t,v
> retrieving revision 1.10
> diff -u -p -r1.10 obsd-regress.t
> --- regress/bin/ksh/obsd-regress.t    8 Dec 2018 21:03:51 -0000       1.10
> +++ regress/bin/ksh/obsd-regress.t    21 Feb 2021 18:51:54 -0000
> @@ -503,3 +503,16 @@ description:
>  stdin:
>       kill -s SIGINFO $$
>  ---
> +
> +name: overwrite-ro-array
> +description:
> +     do not allow to override first element of a read-only array
> +     via the non-array access.
> +stdin:
> +     arr[0]=foo
> +     readonly arr
> +     arr=bar
> +expected-exit: e == 1
> +expected-stderr-pattern:
> +     /: arr: is read only$/
> +---
> Index: bin/ksh/var.c
> ===================================================================
> RCS file: /cvs/src/bin/ksh/var.c,v
> retrieving revision 1.71
> diff -u -p -r1.71 var.c
> --- bin/ksh/var.c     21 Feb 2020 18:21:23 -0000      1.71
> +++ bin/ksh/var.c     21 Feb 2021 18:51:54 -0000
> @@ -644,7 +644,7 @@ typeset(const char *var, int set, int cl
>           global(tvar);
>       set &= ~(LOCAL|LOCAL_COPY);
>  
> -     vpbase = (vp->flag & ARRAY) ? global(arrayname(var)) : vp;
> +     vpbase = (vp->flag & ARRAY) ? global(arrayname(tvar)) : vp;
>  
>       /* only allow export flag to be set.  at&t ksh allows any attribute to
>        * be changed, which means it can be truncated or modified
>

Hi Vadim,

I just tried this patch out and it appears to fix the issue -- thanks! I tried 
running a few large shell scripts that make use of arrays and everything worked 
as expected.

I don't have the authority to give you an ok, but I would certainly like to see 
this patch accepted.

Regards,

Jordan

Reply via email to