I wanted to resend this, tagging that there is a one-line patch included diff --git a/editors/awk.c b/editors/awk.c index bc95c4155..60b8276e7 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -1983,3 +1983,3 @@ static void fsrealloc(int size) for (; i < maxfields; i++) { - Fields[i].type = VF_SPECIAL; + Fields[i].type = VF_SPECIAL | VF_DIRTY; Fields[i].string = NULL;
Mike On Fri, 15 Dec 2023 at 00:07, M Rubon <rubon...@gmail.com> wrote: > > Busybox awk handles references to empty (not provided in the input) > fields differently during the first line of input, as compared to > subsequent lines. > > root@clean2305:~# (echo a ; echo b) | awk '$2 != 0' #wrong > b > > No field $2 value is provided in the input. When awk references field > $2 for the "a" line, it is seen to have a different behaviour than > when it is referenced for the "b" line. > > Problem in BusyBox v1.36.1 embedded in OpenWrt 23.05.0 > Same problem also in 21.02 versions of OpenWrt > Same problem in BusyBox v1.37.0.git > > I get the correct expected output from Ubuntu gawk and Debian mawk, > and from my fix. > will@dev:~$ (echo a ; echo b) | awk '$2 != 0' #correct > a > b > will@dev:~/busybox$ (echo a ; echo b ) | ./busybox awk '$2 != 0' #fixed > a > b > > I built and poked into the source code at editors/awk.c The function > fsrealloc(int size) is core to allocating, initializing, reallocating, > and reinitializing fields, both real input line fields and imaginary > fields that the script references but do not exist in the input. > > When fsrealloc() needs more field space than it has previously > allocated, it initializes those new fields differently than how they > are later reinitialized for the next input line. This works fine for > fields defined in the input, like $1, but does not work the first time > when there is no input for that field (e.g. field $99) > > My one-line fix simply makes the initialization and clrvar() > reinitialization use the same value for .type. I am not sure if there > are regression tests to run, but I have not done those. > > I'm not sure if I understand why clrvar() is not setting .type to a > default constant value, but in any case I have left that untouched. > > I am a happy busybox user. Thank you very much for your work on the system! > > M > > > diff --git a/editors/awk.c b/editors/awk.c > index bc95c4155..60b8276e7 100644 > --- a/editors/awk.c > +++ b/editors/awk.c > @@ -1981,7 +1981,7 @@ static void fsrealloc(int size) > /* ^^^ did Fields[] move? debug aid for L.v getting > "upstaged" by R.v in evaluate() */ > > for (; i < maxfields; i++) { > - Fields[i].type = VF_SPECIAL; > + Fields[i].type = VF_SPECIAL | VF_DIRTY; > Fields[i].string = NULL; > } > } _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox