Merge branch 'master' into fmt-overflow

This commit is contained in:
onetrueawk 2019-01-21 14:02:18 -05:00 committed by GitHub
commit 611f775d8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 42 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2018-08-29 Arnold D. Robbins <arnold@skeeve.com>
* REGRESS: Check for existence of a.out. If not there, run
make. Enable core dumps for T.arnold system status test
to work on MacOS X.
2018-08-22 Arnold D. Robbins <arnold@skeeve.com>
* awktest.tar (testdir/T.expr): Fix test for unary plus.

5
FIXES
View File

@ -25,6 +25,11 @@ THIS SOFTWARE.
This file lists all bug fixes, changes, etc., made since the AWK book
was sent to the printers in August, 1987.
Oct 25, 2018:
Added test in maketab.c to prevent generating a proctab entry
for YYSTYPE_IS_DEFINED. It was harmless but some gcc settings
generated a warning message. Thanks to Nan Xiao for report.
Aug 27, 2018:
Disallow '$' in printf formats; arguments evaluated in order
and printed in order.

15
REGRESS
View File

@ -1,5 +1,15 @@
#! /bin/sh
case `uname` in
CYGWIN) EXE=a.exe ;;
*) EXE=a.out ;;
esac
if [ ! -f $EXE ]
then
make || exit 1
fi
if [ -d testdir ]
then
true # do nothing
@ -16,5 +26,10 @@ cd testdir
pwd
PATH=.:$PATH
export PATH
if (ulimit -c unlimited > /dev/null 2>&1)
then
# Workaround broken default on MacOS X
ulimit -c unlimited
fi
REGRESS

View File

@ -24,6 +24,11 @@ and also if CONVFMT changed.
7. unary-plus: Unary plus on a string constant returned the string.
Instead, it should convert the value to numeric and give that value.
X. fmt-overflow: The buffer used for OFMT/CONVFMT conversions was written
8. missing-precision: When using the format string "%*s", the precision
argument was used without checking if it was present first.
9. fmt-overflow: The buffer used for OFMT/CONVFMT conversions was written
to with sprintf(), which meant that some conversions could write past the
end.

View File

@ -0,0 +1 @@
BEGIN { printf("%*s"); }

View File

@ -0,0 +1,2 @@
./a.out: not enough args in printf(%*s)
source line number 1

View File

@ -34,8 +34,8 @@ CC = gcc -g -Wall -pedantic
# yacc options. pick one; this varies a lot by system.
#YFLAGS = -d -S
#YACC = bison -d -y
YACC = yacc -d
YACC = bison -d -y
#YACC = yacc -d
# -S uses sprintf in yacc parser instead of sprint
OFILES = b.o main.o parse.o proctab.o tran.o lib.o run.o lex.o

View File

@ -135,6 +135,8 @@ int main(int argc, char *argv[])
n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok);
if (c != '#' || (n != 4 && strcmp(def,"define") != 0)) /* not a valid #define */
continue;
if (strcmp(name, "YYSTYPE_IS_DECLARED") == 0)
continue;
if (tok < FIRSTTOKEN || tok > LASTTOKEN) {
/* fprintf(stderr, "maketab funny token %d %s ignored\n", tok, buf); */
continue;

3
run.c
View File

@ -863,6 +863,9 @@ int format(char **pbuf, int *pbufsize, const char *s, Node *a) /* printf-like co
FATAL("'$' not permitted in awk formats");
}
if (*s == '*') {
if (a == NULL) {
FATAL("not enough args in printf(%s)", os);
}
x = execute(a);
a = a->nnext;
sprintf(t-1, "%d", fmtwd=(int) getfval(x));