Date: Wed, 6 Oct 2004 10:30:28 GMT From: Giorgos Keramidas <keramida@freebsd.org> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/72370: awk in -current dumps core Message-ID: <200410061030.i96AUSTe035875@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/72370; it has been noted by GNATS.
From: Giorgos Keramidas <keramida@freebsd.org>
To: Joseph Koshy <jkoshy@freebsd.org>
Cc: "David O'Brien" <obrien@freebsd.org>, bug-followup@freebsd.org
Subject: Re: bin/72370: awk in -current dumps core
Date: Wed, 6 Oct 2004 13:22:26 +0300
On 2004-10-06 06:06, Giorgos Keramidas <keramida@freebsd.org> wrote:
> What you see below:
> > $ echo | /4/usr/bin/awk '{ x = 2147483647; print $x }'
> > *blank line*
> > $ echo | /5/usr/bin/awk '{ x = 2147483648; print $x }'
> > /5/usr/bin/awk: trying to access field -2147483648
> > input record number 1, file
> > source line number 1
>
> is a result of the fieldaddr() function in lib.c, which does:
>
> 378 Cell *fieldadr(int n) /* get nth field */
> 379 {
> 380 if (n < 0)
> 381 FATAL("trying to access field %d", n);
> 382 if (n > nfields) /* fields after NF are empty */
> 383 growfldtab(n); /* but does not increase NF */
> 384 return(fldtab[n]);
> 385 }
>
> so negative field numbers are warned about but field numbers greater than the
> existing fields are silently converted to empty strings.
The overflow shown above can be fixed with this minor patch:
: Index: run.c
: ===================================================================
: RCS file: /home/ncvs/src/contrib/one-true-awk/run.c,v
: retrieving revision 1.1.1.7
: diff -u -u -r1.1.1.7 run.c
: --- run.c 8 Feb 2004 21:32:21 -0000 1.1.1.7
: +++ run.c 6 Oct 2004 10:18:17 -0000
: @@ -26,6 +26,7 @@
: #include <stdio.h>
: #include <ctype.h>
: #include <setjmp.h>
: +#include <limits.h>
: #include <math.h>
: #include <string.h>
: #include <stdlib.h>
: @@ -705,12 +706,16 @@
:
: Cell *indirect(Node **a, int n) /* $( a[0] ) */
: {
: + Awkfloat val;
: Cell *x;
: int m;
: char *s;
:
: x = execute(a[0]);
: - m = (int) getfval(x);
: + val = getfval(x);
: + if ((Awkfloat)INT_MAX < val)
: + FATAL("trying to access field %s", x->nval);
: + m = (int) val;
: if (m == 0 && !is_number(s = getsval(x))) /* suspicion! */
: FATAL("illegal field $(%s), name \"%s\"", s, x->nval);
: /* BUG: can x->nval ever be null??? */
I'm still investigating if something can be done about the other places
where nawk might start accessing field numbers way beyond the limits of
INT_MAX. Its source is fairly complicated for my limited C knowledge
though, so don't hold your breath.
- Giorgos
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200410061030.i96AUSTe035875>
