Update awk to Sep 6, 2023 version.
authormillert <millert@openbsd.org>
Sun, 10 Sep 2023 14:59:00 +0000 (14:59 +0000)
committermillert <millert@openbsd.org>
Sun, 10 Sep 2023 14:59:00 +0000 (14:59 +0000)
usr.bin/awk/FIXES
usr.bin/awk/awkgram.y
usr.bin/awk/lex.c
usr.bin/awk/lib.c
usr.bin/awk/main.c
usr.bin/awk/parse.c
usr.bin/awk/proto.h

index 53c7841..8cbd6ac 100644 (file)
@@ -25,6 +25,14 @@ THIS SOFTWARE.
 This file lists all bug fixes, changes, etc., made since the AWK book
 was sent to the printers in August 1987.
 
+Sep 06, 2023:
+       Fix edge case where FS is changed on commandline. Thanks to 
+       Gordon Shephard and Miguel Pineiro Jr.
+
+       Fix regular expression clobbering in the lexer, where lexer does
+       not make a copy of regexp literals. also makedfa memory leaks have
+       been plugged. Thanks to Miguel Pineiro Jr.
+       
 Dec 15, 2022:
        Force hex escapes in strings to be no more than two characters,
        as they already are in regular expressions. This brings internal
index f9a5330..9894bcc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: awkgram.y,v 1.15 2022/09/01 15:21:28 millert Exp $    */
+/*     $OpenBSD: awkgram.y,v 1.16 2023/09/10 14:59:00 millert Exp $    */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -205,7 +205,7 @@ ppattern:
                { $$ = op2(BOR, notnull($1), notnull($3)); }
        | ppattern and ppattern %prec AND
                { $$ = op2(AND, notnull($1), notnull($3)); }
-       | ppattern MATCHOP reg_expr     { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); }
+       | ppattern MATCHOP reg_expr     { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); free($3); }
        | ppattern MATCHOP ppattern
                { if (constnode($3)) {
                        $$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0));
@@ -233,7 +233,7 @@ pattern:
        | pattern LE pattern            { $$ = op2($2, $1, $3); }
        | pattern LT pattern            { $$ = op2($2, $1, $3); }
        | pattern NE pattern            { $$ = op2($2, $1, $3); }
-       | pattern MATCHOP reg_expr      { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); }
+       | pattern MATCHOP reg_expr      { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); free($3); }
        | pattern MATCHOP pattern
                { if (constnode($3)) {
                        $$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0));
@@ -283,7 +283,7 @@ rbrace:
 
 re:
           reg_expr
-               { $$ = op3(MATCH, NIL, rectonode(), (Node*)makedfa($1, 0)); }
+               { $$ = op3(MATCH, NIL, rectonode(), (Node*)makedfa($1, 0)); free($1); }
        | NOT re        { $$ = op1(NOT, notnull($2)); }
        ;
 
@@ -407,7 +407,7 @@ term:
                  $$ = op2(INDEX, $3, (Node*)$5); }
        | '(' pattern ')'               { $$ = $2; }
        | MATCHFCN '(' pattern comma reg_expr ')'
-               { $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa($5, 1)); }
+               { $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa($5, 1)); free($5); }
        | MATCHFCN '(' pattern comma pattern ')'
                { if (constnode($5)) {
                        $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa(strnode($5), 1));
@@ -418,13 +418,13 @@ term:
        | SPLIT '(' pattern comma varname comma pattern ')'     /* string */
                { $$ = op4(SPLIT, $3, makearr($5), $7, (Node*)STRING); }
        | SPLIT '(' pattern comma varname comma reg_expr ')'    /* const /regexp/ */
-               { $$ = op4(SPLIT, $3, makearr($5), (Node*)makedfa($7, 1), (Node *)REGEXPR); }
+               { $$ = op4(SPLIT, $3, makearr($5), (Node*)makedfa($7, 1), (Node *)REGEXPR); free($7); }
        | SPLIT '(' pattern comma varname ')'
                { $$ = op4(SPLIT, $3, makearr($5), NIL, (Node*)STRING); }  /* default */
        | SPRINTF '(' patlist ')'       { $$ = op1($1, $3); }
        | string                        { $$ = celltonode($1, CCON); }
        | subop '(' reg_expr comma pattern ')'
-               { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); }
+               { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); free($3); }
        | subop '(' pattern comma pattern ')'
                { if (constnode($3)) {
                        $$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, rectonode());
@@ -432,7 +432,7 @@ term:
                  } else
                        $$ = op4($1, (Node *)1, $3, $5, rectonode()); }
        | subop '(' reg_expr comma pattern comma var ')'
-               { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, $7); }
+               { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, $7); free($3); }
        | subop '(' pattern comma pattern comma var ')'
                { if (constnode($3)) {
                        $$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, $7);
index 213f5d0..9ca1d0d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lex.c,v 1.29 2023/09/09 18:59:43 millert Exp $        */
+/*     $OpenBSD: lex.c,v 1.30 2023/09/10 14:59:00 millert Exp $        */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -588,7 +588,7 @@ int regexpr(void)
        *bp = 0;
        if (c == 0)
                SYNTAX("non-terminated regular expression %.10s...", buf);
-       yylval.s = buf;
+       yylval.s = tostring(buf);
        unput('/');
        RET(REGEXPR);
 }
index 87cc78e..90d34a7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lib.c,v 1.49 2022/09/01 15:21:28 millert Exp $        */
+/*     $OpenBSD: lib.c,v 1.50 2023/09/10 14:59:00 millert Exp $        */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -148,11 +148,6 @@ int getrec(char **pbuf, int *pbufsize, bool isrecord)      /* get next input record *
        }
        DPRINTF("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n",
                *RS, *FS, *ARGC, *FILENAME);
-       if (isrecord) {
-               donefld = false;
-               donerec = true;
-               savefs();
-       }
        saveb0 = buf[0];
        buf[0] = 0;
        while (argno < *ARGC || infile == stdin) {
@@ -192,6 +187,9 @@ int getrec(char **pbuf, int *pbufsize, bool isrecord)       /* get next input record *
                                        fldtab[0]->fval = result;
                                        fldtab[0]->tval |= NUM;
                                }
+                               donefld = false;
+                               donerec = true;
+                               savefs();
                        }
                        setfval(nrloc, nrloc->fval+1);
                        setfval(fnrloc, fnrloc->fval+1);
index ccd557c..67eeff9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: main.c,v 1.57 2023/09/09 18:59:43 millert Exp $       */
+/*     $OpenBSD: main.c,v 1.58 2023/09/10 14:59:00 millert Exp $       */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -23,7 +23,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 THIS SOFTWARE.
 ****************************************************************/
 
-const char     *version = "version 20221215";
+const char     *version = "version 20230909";
 
 #define DEBUG
 #include <stdio.h>
index abd5c4f..cb192de 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: parse.c,v 1.13 2020/12/09 20:00:11 millert Exp $      */
+/*     $OpenBSD: parse.c,v 1.14 2023/09/10 14:59:00 millert Exp $      */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -30,7 +30,7 @@ THIS SOFTWARE.
 #include "awk.h"
 #include "awkgram.tab.h"
 
-Node *nodealloc(int n)
+Node *nodealloc(size_t n)
 {
        Node *x;
 
index 0c37d53..374c5af 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: proto.h,v 1.20 2020/12/09 20:00:11 millert Exp $      */
+/*     $OpenBSD: proto.h,v 1.21 2023/09/10 14:59:00 millert Exp $      */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -69,7 +69,7 @@ extern        void    freefa(fa *);
 extern int     pgetc(void);
 extern char    *cursource(void);
 
-extern Node    *nodealloc(int);
+extern Node    *nodealloc(size_t);
 extern Node    *exptostat(Node *);
 extern Node    *node1(int, Node *);
 extern Node    *node2(int, Node *, Node *);