awk: i386 broken

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

awk: i386 broken

Stuart Henderson
See attached test case extracted from libgpg-error, it fails on i386
but works on amd64. (ports/lang/gcc failed too, I forgot to save the build
directory).

TZ=GMT cvs up -D '2020/06/10 21:05:00'
January 5, 2020
works as expected

TZ=GMT cvs up -D '2020/06/10 21:05:10'
January 31, 2020
building awk fails

TZ=GMT cvs up -D '2020/06/10 21:05:50'
February 28, 2020
building awk works, test case fails

$ cc -E -P _mkerrcodes.h | grep GPG_ERR_ | awk -f ./mkerrcodes.awk > /dev/null
awk: nonterminated character class [
 input record number 2, file
 source line number 93
*** Error 2 in /tmp/awk-problem (Makefile:4 'all')

I am going to start a ports build with the January 5 version, i.e. the
following backout:

Index: FIXES
===================================================================
RCS file: /cvs/src/usr.bin/awk/FIXES,v
retrieving revision 1.33
diff -u -p -r1.33 FIXES
--- FIXES 10 Jun 2020 21:06:09 -0000 1.33
+++ FIXES 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: FIXES,v 1.33 2020/06/10 21:06:09 millert Exp $ */
+/* $OpenBSD: FIXES,v 1.30 2020/06/10 21:04:40 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -26,60 +26,6 @@ THIS SOFTWARE.
 This file lists all bug fixes, changes, etc., made since the AWK book
 was sent to the printers in August, 1987.
 
-June 5, 2020:
- In fldbld(), make sure that inputFS is set before trying to
- use it. Thanks to  Steffen Nurpmeso <[hidden email]>
- for the report.
-
-May 5, 2020:
- Fix checks for compilers that can handle noreturn. Thanks to
- GitHub user enh-google for pointing it out. Closes Issue #79.
-
-April 16, 2020:
- Handle old compilers that don't support C11 (for noreturn).
- Thanks to Arnold Robbins.
-
-April 5, 2020:
- Use <stdnoreturn.h> and noreturn instead of GCC attributes.
- Thanks to GitHub user awkfan77. Closes PR #77.
-
-February 28, 2020:
- More cleanups from Christos Zoulas: notably backslash continuation
- inside strings removes the newline and a fix for RS = "^a".
- Fix for address sanitizer-found problem. Thanks to GitHub user
- enh-google.
-
-February 19, 2020:
- More small cleanups from Christos Zoulas.
-
-February 18, 2020:
- Additional cleanups from Christos Zoulas. It's no longer necessary
- to use the -y flag to bison.
-
-February 6, 2020:
- Additional small cleanups from Christos Zoulas. awk is now
- a little more robust about reporting I/O errors upon exit.
-
-January 31, 2020:
- Merge PR #70, which avoids use of variable length arrays. Thanks
- to GitHub user michaelforney.  Fix issue #60 ({0} in interval
- expressions doesn't work).  Also get all tests working again.
- Thanks to Arnold Robbins.
-
-January 24, 2020:
- A number of small cleanups from Christos Zoulas.  Add the close
- on exec flag to files/pipes opened for redirection; courtesy of
- Arnold Robbins.
-
-January 19, 2020:
- If POSIXLY_CORRECT is set in the environment, then sub and gsub
- use POSIX rules for multiple backslashes.  This fixes Issue #66,
- while maintaining backwards compatibility.
-
-January 9, 2020:
- Input/output errors on closing files are now fatal instead of
- mere warnings. Thanks to Martijn Dekker <[hidden email]>.
-
 January 5, 2020:
  Fix a bug in the concatentation of two string constants into
  one done in the grammar.  Fixes GitHub issue #61.  Thanks
@@ -118,13 +64,13 @@ October 25, 2019:
 
 October 24, 2019:
  Import second round of code cleanups from NetBSD. Much thanks
- to Christos Zoulas (GitHub user zoulasc). Merges PR 53.
+ to Christos Zoulas (Github user zoulasc). Merges PR 53.
  Add an optimization for string concatenation, also from
  Christos.
 
 October 17, 2019:
  Import code cleanups from NetBSD. Much thanks to Christos
- Zoulas (GitHub user zoulasc). Merges PR 51.
+ Zoulas (Github user zoulasc). Merges PR 51.
 
 October 6, 2019:
  Import code from NetBSD awk that implements RS as a regular
@@ -132,7 +78,7 @@ October 6, 2019:
 
 September 10, 2019:
  Fixes for various array / memory overruns found via gcc's
- -fsanitize=unknown. Thanks to Alexander Richardson (GitHub
+ -fsanitize=unknown. Thanks to Alexander Richardson (Github
  user arichardson). Merges PRs 47 and 48.
 
 July 28, 2019:
Index: README.md
===================================================================
RCS file: /cvs/src/usr.bin/awk/README.md,v
retrieving revision 1.2
diff -u -p -r1.2 README.md
--- README.md 10 Jun 2020 21:05:50 -0000 1.2
+++ README.md 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-$OpenBSD: README.md,v 1.2 2020/06/10 21:05:50 millert Exp $
+$OpenBSD: README.md,v 1.1 2020/06/10 21:04:40 millert Exp $
 
 # The One True Awk
 
@@ -44,19 +44,7 @@ Thanks.
 
 ## Submitting Pull Requests
 
-Pull requests are welcome. Some guidelines:
-
-* Please do not use functions or facilities that are not standard (e.g.,
-`strlcpy()`, `fpurge()`).
-
-* Please run the test suite and make sure that your changes pass before
-posting the pull request. To do so:
-
-  1. Save the previous version of `awk` somewhere in your path. Call it `nawk` (for example).
-  1. Run `oldawk=nawk make check > check.out 2>&1`.
-  1. Search for `BAD` or `error` in the result. In general, look over it manually to make sure there are no errors.
-
-* Please create the pull request with a request
+Pull requests are welcome.  However, please create them with a request
 to merge into the `staging` branch instead of into the `master` branch.
 This allows us to do testing, and to make any additional edits or changes
 after the merge but before merging to `master`.
Index: awk.1
===================================================================
RCS file: /cvs/src/usr.bin/awk/awk.1,v
retrieving revision 1.50
diff -u -p -r1.50 awk.1
--- awk.1 10 Jun 2020 21:05:02 -0000 1.50
+++ awk.1 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-.\" $OpenBSD: awk.1,v 1.50 2020/06/10 21:05:02 millert Exp $
+.\" $OpenBSD: awk.1,v 1.49 2020/06/10 21:02:53 millert Exp $
 .\"
 .\" Copyright (C) Lucent Technologies 1997
 .\" All Rights Reserved
@@ -726,14 +726,6 @@ Returns integer argument x shifted by n
 .It Fn rshift x n
 Returns integer argument x shifted by n bits to the right.
 .El
-.Sh ENVIRONMENT
-The following environment variables affect the execution of
-.Nm :
-.Bl -tag -width POSIXLY_CORRECT
-.It Ev POSIXLY_CORRECT
-When set, behave in accordance with the standard, even when it conflicts
-with historical behavior.
-.El
 .Sh EXIT STATUS
 .Ex -std awk
 .Pp
@@ -800,12 +792,7 @@ The
 .Nm
 utility is compliant with the
 .St -p1003.1-2008
-specification except that consecutive backslashes in the replacement
-string argument for
-.Fn sub
-and
-.Fn gsub
-are not collapsed.
+specification.
 .Pp
 The flags
 .Op Fl \&dV
Index: awk.h
===================================================================
RCS file: /cvs/src/usr.bin/awk/awk.h,v
retrieving revision 1.23
diff -u -p -r1.23 awk.h
--- awk.h 10 Jun 2020 21:06:09 -0000 1.23
+++ awk.h 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: awk.h,v 1.23 2020/06/10 21:06:09 millert Exp $ */
+/* $OpenBSD: awk.h,v 1.21 2020/06/10 21:03:56 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -26,11 +26,6 @@ THIS SOFTWARE.
 #include <assert.h>
 #include <stdint.h>
 #include <stdbool.h>
-#if __STDC_VERSION__ <= 199901L
-#define noreturn __dead
-#else
-#include <stdnoreturn.h>
-#endif
 
 typedef double Awkfloat;
 
@@ -66,7 +61,6 @@ extern bool safe; /* false => unsafe, t
 #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */
 extern int recsize; /* size of current record, orig RECSIZE */
 
-extern char EMPTY[]; /* this avoid -Wwritable-strings issues */
 extern char **FS;
 extern char **RS;
 extern char **ORS;
@@ -85,6 +79,8 @@ extern int lineno; /* line number in aw
 extern int errorflag; /* 1 if error has occurred */
 extern bool donefld; /* true if record broken into fields */
 extern bool donerec; /* true if record is valid (no fld has changed */
+extern char inputFS[]; /* FS at time of input, for field splitting */
+
 extern int dbg;
 
 extern const char *patbeg; /* beginning of pattern matched */
Index: awkgram.y
===================================================================
RCS file: /cvs/src/usr.bin/awk/awkgram.y,v
retrieving revision 1.13
diff -u -p -r1.13 awkgram.y
--- awkgram.y 10 Jun 2020 21:05:02 -0000 1.13
+++ awkgram.y 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: awkgram.y,v 1.13 2020/06/10 21:05:02 millert Exp $ */
+/* $OpenBSD: awkgram.y,v 1.12 2020/06/10 21:03:56 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -51,7 +51,7 @@ Node *arglist = 0; /* list of args for c
 %token <i> NL ',' '{' '(' '|' ';' '/' ')' '}' '[' ']'
 %token <i> ARRAY
 %token <i> MATCH NOTMATCH MATCHOP
-%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS EMPTYRE ZERO
+%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS EMPTYRE
 %token <i> AND BOR APPEND EQ GE GT LE LT NE IN
 %token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC
 %token <i> SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT NEXTFILE
Index: b.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/b.c,v
retrieving revision 1.31
diff -u -p -r1.31 b.c
--- b.c 10 Jun 2020 21:05:02 -0000 1.31
+++ b.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: b.c,v 1.31 2020/06/10 21:05:02 millert Exp $ */
+/* $OpenBSD: b.c,v 1.30 2020/06/10 21:04:40 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -271,8 +271,6 @@ void penter(Node *p) /* set up parent po
  parent(left(p)) = p;
  parent(right(p)) = p;
  break;
- case ZERO:
- break;
  default: /* can't happen */
  FATAL("can't happen: unknown type %d in penter", type(p));
  break;
@@ -287,7 +285,6 @@ void freetr(Node *p) /* free parse tree
  xfree(p);
  break;
  UNARY
- case ZERO:
  freetr(left(p));
  xfree(p);
  break;
@@ -447,8 +444,6 @@ void cfoll(fa *f, Node *v) /* enter foll
  cfoll(f,left(v));
  cfoll(f,right(v));
  break;
- case ZERO:
- break;
  default: /* can't happen */
  FATAL("can't happen: unknown type %d in cfoll", type(v));
  }
@@ -492,8 +487,6 @@ int first(Node *p) /* collects initially
  b = first(right(p));
  if (first(left(p)) == 0 || b == 0) return(0);
  return(1);
- case ZERO:
- return 0;
  }
  FATAL("can't happen: unknown type %d in first", type(p)); /* can't happen */
  return(-1);
@@ -853,9 +846,6 @@ Node *unary(Node *np)
  case QUEST:
  rtok = relex();
  return (unary(op2(QUEST, np, NIL)));
- case ZERO:
- rtok = relex();
- return (unary(op2(ZERO, np, NIL)));
  default:
  return (np);
  }
@@ -890,7 +880,7 @@ int (xisblank)(int c)
 
 #endif
 
-static const struct charclass {
+struct charclass {
  const char *cc_name;
  int cc_namelen;
  int (*cc_func)(int);
@@ -926,7 +916,7 @@ replace_repeat(const uschar *reptok, int
  int i, j;
  uschar *buf = NULL;
  int ret = 1;
- int init_q = (firstnum == 0); /* first added char will be ? */
+ bool init_q = (firstnum == 0); /* first added char will be ? */
  int n_q_reps = secondnum-firstnum; /* m>n, so reduce until {1,m-n} left  */
  int prefix_length = reptok - basestr; /* prefix includes first rep */
  int suffix_length = strlen((const char *) reptok) - reptoklen; /* string after rep specifier */
@@ -1034,7 +1024,7 @@ int relex(void) /* lexical analyzer for
  static uschar *buf = NULL;
  static int bufsz = 100;
  uschar *bp;
- const struct charclass *cc;
+ struct charclass *cc;
  int i;
  int num, m;
  bool commafound, digitfound;
@@ -1208,7 +1198,7 @@ rescan:
  if (repeat(starttok, prestr-starttok, lastatom,
    startreptok - lastatom, n, m) > 0) {
  if (n == 0 && m == 0) {
- return ZERO;
+ return EMPTYRE;
  }
  /* must rescan input for next token */
  goto rescan;
Index: lex.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/lex.c,v
retrieving revision 1.19
diff -u -p -r1.19 lex.c
--- lex.c 10 Jun 2020 21:05:50 -0000 1.19
+++ lex.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: lex.c,v 1.19 2020/06/10 21:05:50 millert Exp $ */
+/* $OpenBSD: lex.c,v 1.17 2020/06/10 21:04:40 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -31,7 +31,7 @@ THIS SOFTWARE.
 #include "ytab.h"
 
 extern YYSTYPE yylval;
-extern bool infunc;
+extern int infunc;
 
 int lineno = 1;
 int bracecnt = 0;
@@ -44,7 +44,7 @@ typedef struct Keyword {
  int type;
 } Keyword;
 
-const Keyword keywords[] = { /* keep sorted: binary searched */
+Keyword keywords[] ={ /* keep sorted: binary searched */
  { "BEGIN", XBEGIN, XBEGIN },
  { "END", XEND, XEND },
  { "NF", VARNF, VARNF },
@@ -98,14 +98,18 @@ const Keyword keywords[] = { /* keep sor
 
 #define RET(x) { if(dbg)printf("lex %s\n", tokname(x)); return(x); }
 
-static int peek(void)
+int peek(void);
+int gettok(char **, int *);
+int binsearch(char *, Keyword *, int);
+
+int peek(void)
 {
  int c = input();
  unput(c);
  return c;
 }
 
-static int gettok(char **pbuf, int *psz) /* get next input token */
+int gettok(char **pbuf, int *psz) /* get next input token */
 {
  int c, retc;
  char *buf = *pbuf;
@@ -217,11 +221,6 @@ int yylex(void)
  while ((c = input()) != '\n' && c != 0)
  ;
  unput(c);
- /*
- * Next line is a hack, itcompensates for
- * unput's treatment of \n.
- */
- lineno++;
  break;
  case ';':
  RET(';');
@@ -395,7 +394,6 @@ int string(void)
  case '\\':
  c = input();
  switch (c) {
- case '\n': break;
  case '"': *bp++ = '"'; break;
  case 'n': *bp++ = '\n'; break;
  case 't': *bp++ = '\t'; break;
@@ -403,7 +401,7 @@ int string(void)
  case 'r': *bp++ = '\r'; break;
  case 'b': *bp++ = '\b'; break;
  case 'v': *bp++ = '\v'; break;
- case 'a': *bp++ = '\a'; break;
+ case 'a': *bp++ = '\007'; break;
  case '\\': *bp++ = '\\'; break;
 
  case '0': case '1': case '2': /* octal: \d \dd \ddd */
@@ -453,7 +451,7 @@ int string(void)
 }
 
 
-static int binsearch(char *w, const Keyword *kp, int n)
+int binsearch(char *w, Keyword *kp, int n)
 {
  int cond, low, mid, high;
 
@@ -473,7 +471,7 @@ static int binsearch(char *w, const Keyw
 
 int word(char *w)
 {
- const Keyword *kp;
+ Keyword *kp;
  int c, n;
 
  n = binsearch(w, keywords, sizeof(keywords)/sizeof(keywords[0]));
@@ -589,8 +587,6 @@ int input(void) /* get next lexical inpu
 
 void unput(int c) /* put lexical character back on input */
 {
- if (c == '\n')  
- lineno--;
  if (yysptr >= yysbuf + sizeof(yysbuf))
  FATAL("pushed back too much: %.20s...", yysbuf);
  *yysptr++ = c;
Index: lib.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/lib.c,v
retrieving revision 1.35
diff -u -p -r1.35 lib.c
--- lib.c 10 Jun 2020 21:06:09 -0000 1.35
+++ lib.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: lib.c,v 1.35 2020/06/10 21:06:09 millert Exp $ */
+/* $OpenBSD: lib.c,v 1.32 2020/06/10 21:03:56 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -29,23 +29,20 @@ THIS SOFTWARE.
 #include <ctype.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <stdarg.h>
-#include <limits.h>
 #include "awk.h"
 #include "ytab.h"
 
-char EMPTY[] = { '\0' };
 FILE *infile = NULL;
-bool innew; /* true = infile has not been read by readrec */
-char *file = EMPTY;
+char *file = "";
 char *record;
 int recsize = RECSIZE;
 char *fields;
 int fieldssize = RECSIZE;
 
 Cell **fldtab; /* pointers to Cells */
-static size_t len_inputFS = 0;
-static char *inputFS = NULL; /* FS at time of input, for field splitting */
+char inputFS[100] = " ";
 
 #define MAXFLD 2
 int nfields = MAXFLD; /* last allocated slot for $i */
@@ -57,8 +54,8 @@ int lastfld = 0; /* last used field */
 int argno = 1; /* current input argument number */
 extern Awkfloat *ARGC;
 
-static Cell dollar0 = { OCELL, CFLD, NULL, EMPTY, 0.0, REC|STR|DONTFREE, NULL, NULL };
-static Cell dollar1 = { OCELL, CFLD, NULL, EMPTY, 0.0, FLD|STR|DONTFREE, NULL, NULL };
+static Cell dollar0 = { OCELL, CFLD, NULL, "", 0.0, REC|STR|DONTFREE };
+static Cell dollar1 = { OCELL, CFLD, NULL, "", 0.0, FLD|STR|DONTFREE };
 
 void recinit(unsigned int n)
 {
@@ -108,7 +105,6 @@ void initgetrec(void)
  argno++;
  }
  infile = stdin; /* no filenames, so use stdin */
- innew = true;
 }
 
 /*
@@ -122,17 +118,9 @@ void initgetrec(void)
  */
 void savefs(void)
 {
- size_t len;
- if ((len = strlen(getsval(fsloc))) < len_inputFS) {
- strlcpy(inputFS, *FS, sizeof(inputFS)); /* for subsequent field splitting */
- return;
- }
-
- len_inputFS = len + 1;
- inputFS = realloc(inputFS, len_inputFS);
- if (inputFS == NULL)
+ if (strlen(getsval(fsloc)) >= sizeof (inputFS))
  FATAL("field separator %.10s... is too long", *FS);
- memcpy(inputFS, *FS, len_inputFS);
+ strlcpy(inputFS, *FS, sizeof(inputFS));
 }
 
 static bool firsttime = true;
@@ -178,9 +166,7 @@ int getrec(char **pbuf, int *pbufsize, b
  FATAL("can't open file %s", file);
  setfval(fnrloc, 0.0);
  }
- c = readrec(&buf, &bufsize, infile, innew);
- if (innew)
- innew = false;
+ c = readrec(&buf, &bufsize, infile);
  if (c != 0 || buf[0] != '\0') { /* normal record */
  if (isrecord) {
  if (freeable(fldtab[0]))
@@ -218,7 +204,7 @@ void nextfile(void)
  argno++;
 }
 
-int readrec(char **pbuf, int *pbufsize, FILE *inf, bool newflag) /* read one record into buf */
+int readrec(char **pbuf, int *pbufsize, FILE *inf) /* read one record into buf */
 {
  int sep, c, isrec;
  char *rr, *buf = *pbuf;
@@ -229,14 +215,7 @@ int readrec(char **pbuf, int *pbufsize,
  bool found;
 
  fa *pfa = makedfa(rs, 1);
- if (newflag)
- found = fnematch(pfa, inf, &buf, &bufsize, recsize);
- else {
- int tempstat = pfa->initstat;
- pfa->initstat = 2;
- found = fnematch(pfa, inf, &buf, &bufsize, recsize);
- pfa->initstat = tempstat;
- }
+ found = fnematch(pfa, inf, &buf, &bufsize, recsize);
  if (found)
  setptr(patbeg, '\0');
  } else {
@@ -333,8 +312,6 @@ void fldbld(void) /* create fields from
  }
  fr = fields;
  i = 0; /* number of fields accumulated here */
- if (inputFS == NULL) /* make sure we have a copy of FS */
- savefs();
  if (strlen(inputFS) > 1) { /* it's a regular expression */
  i = refldbld(r, inputFS);
  } else if ((sep = *inputFS) == ' ') { /* default whitespace */
@@ -358,14 +335,14 @@ void fldbld(void) /* create fields from
  *fr = 0;
  } else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */
  for (i = 0; *r != '\0'; r += n) {
- char buf[MB_LEN_MAX + 1];
+ char buf[MB_CUR_MAX + 1];
 
  i++;
  if (i > nfields)
  growfldtab(i);
  if (freeable(fldtab[i]))
  xfree(fldtab[i]->sval);
- n = mblen(r, MB_LEN_MAX);
+ n = mblen(r, MB_CUR_MAX);
  if (n < 0)
  n = 1;
  memcpy(buf, r, n);
@@ -429,7 +406,7 @@ void cleanfld(int n1, int n2) /* clean o
  p = fldtab[i];
  if (freeable(p))
  xfree(p->sval);
- p->sval = EMPTY,
+ p->sval = "";
  p->tval = FLD | STR | DONTFREE;
  }
 }
@@ -475,7 +452,7 @@ void growfldtab(int n) /* make new field
  if (n > nf)
  nf = n;
  s = (nf+1) * (sizeof (struct Cell *));  /* freebsd: how much do we need? */
- if (s / sizeof(struct Cell *) - 1 == (size_t)nf) /* didn't overflow */
+ if (s / sizeof(struct Cell *) - 1 == nf) /* didn't overflow */
  fldtab = realloc(fldtab, s);
  else /* overflow sizeof int */
  xfree(fldtab); /* make it null */
@@ -598,6 +575,33 @@ void SYNTAX(const char *fmt, ...)
  eprint();
 }
 
+void fpecatch(int sig)
+{
+ extern Node *curnode;
+
+ dprintf(STDERR_FILENO, "floating point exception\n");
+
+ if (compile_time != 2 && NR && *NR > 0) {
+ dprintf(STDERR_FILENO, " input record number %d", (int) (*FNR));
+ if (strcmp(*FILENAME, "-") != 0) {
+ dprintf(STDERR_FILENO, ", file %s", *FILENAME);
+ }
+ dprintf(STDERR_FILENO, "\n");
+ }
+ if (compile_time != 2 && curnode) {
+ dprintf(STDERR_FILENO, " source line number %d", curnode->lineno);
+ } else if (compile_time != 2 && lineno) {
+ dprintf(STDERR_FILENO, " source line number %d", lineno);
+ }
+ if (compile_time == 1 && cursource() != NULL) {
+ dprintf(STDERR_FILENO, " source file %s", cursource());
+ }
+ dprintf(STDERR_FILENO, "\n");
+ if (dbg > 1) /* core dump if serious debugging on */
+ abort();
+ _exit(1);
+}
+
 extern int bracecnt, brackcnt, parencnt;
 
 void bracecheck(void)
@@ -626,7 +630,7 @@ void bcheck2(int n, int c1, int c2)
  fprintf(stderr, "\t%d extra %c's\n", -n, c2);
 }
 
-void FATAL(const char *fmt, ...)
+__dead void FATAL(const char *fmt, ...)
 {
  extern char *cmdname;
  va_list varg;
Index: main.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/main.c,v
retrieving revision 1.38
diff -u -p -r1.38 main.c
--- main.c 10 Jun 2020 21:06:09 -0000 1.38
+++ main.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.38 2020/06/10 21:06:09 millert Exp $ */
+/* $OpenBSD: main.c,v 1.35 2020/06/10 21:04:40 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -23,7 +23,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE
 THIS SOFTWARE.
 ****************************************************************/
 
-const char *version = "version 20200605";
+const char *version = "version 20200105";
 
 #define DEBUG
 #include <stdio.h>
@@ -48,91 +48,17 @@ char *lexprog; /* points to program argu
 extern int errorflag; /* non-zero if any syntax errors; set by yyerror */
 enum compile_states compile_time = ERROR_PRINTING;
 
-static char **pfile; /* program filenames from -f's */
-static size_t maxpfile; /* max program filename */
-static size_t npfile; /* number of filenames */
-static size_t curpfile; /* current filename */
+#define MAX_PFILE 20 /* max number of -f's */
 
-bool safe = false; /* true => "safe" mode */
-
-static noreturn void fpecatch(int n
-#ifdef SA_SIGINFO
- , siginfo_t *si, void *uc
-#endif
-)
-{
- extern Node *curnode;
-#ifdef SA_SIGINFO
- static const char *emsg[] = {
- [0] = "Unknown error",
- [FPE_INTDIV] = "Integer divide by zero",
- [FPE_INTOVF] = "Integer overflow",
- [FPE_FLTDIV] = "Floating point divide by zero",
- [FPE_FLTOVF] = "Floating point overflow",
- [FPE_FLTUND] = "Floating point underflow",
- [FPE_FLTRES] = "Floating point inexact result",
- [FPE_FLTINV] = "Invalid Floating point operation",
- [FPE_FLTSUB] = "Subscript out of range",
- };
-#endif
- dprintf(STDERR_FILENO, "floating point exception%s%s\n",
-#ifdef SA_SIGINFO
- ": ", (size_t)si->si_code < sizeof(emsg) / sizeof(emsg[0]) &&
- emsg[si->si_code] ? emsg[si->si_code] : emsg[0]
-#else
- "", ""
-#endif
-    );
-
- if (compile_time != 2 && NR && *NR > 0) {
- dprintf(STDERR_FILENO, " input record number %d", (int) (*FNR));
- if (strcmp(*FILENAME, "-") != 0) {
- dprintf(STDERR_FILENO, ", file %s", *FILENAME);
- }
- dprintf(STDERR_FILENO, "\n");
- }
- if (compile_time != 2 && curnode) {
- dprintf(STDERR_FILENO, " source line number %d", curnode->lineno);
- } else if (compile_time != 2 && lineno) {
- dprintf(STDERR_FILENO, " source line number %d", lineno);
- }
- if (compile_time == 1 && cursource() != NULL) {
- dprintf(STDERR_FILENO, " source file %s", cursource());
- }
- dprintf(STDERR_FILENO, "\n");
- if (dbg > 1) /* core dump if serious debugging on */
- abort();
- _exit(2);
-}
+char *pfile[MAX_PFILE]; /* program filenames from -f's */
+int npfile = 0; /* number of filenames */
+int curpfile = 0; /* current filename */
 
-static const char *
-setfs(char *p)
-{
- /* wart: t=>\t */
- if (p[0] == 't' && p[1] == '\0')
- return "\t";
- else if (p[0] != '\0')
- return p;
- return NULL;
-}
-
-static char *
-getarg(int *argc, char ***argv, const char *msg)
-{
- if ((*argv)[1][2] != '\0') { /* arg is -fsomething */
- return &(*argv)[1][2];
- } else { /* arg is -f something */
- (*argc)--; (*argv)++;
- if (*argc <= 1)
- FATAL("%s", msg);
- return (*argv)[1];
- }
-}
+bool safe = false; /* true => "safe" mode */
 
 int main(int argc, char *argv[])
 {
  const char *fs = NULL;
- char *fn, *vn;
 
  setlocale(LC_ALL, "");
  setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
@@ -150,17 +76,7 @@ int main(int argc, char *argv[])
     cmdname);
  exit(1);
  }
-#ifdef SA_SIGINFO
- {
- struct sigaction sa;
- sa.sa_sigaction = fpecatch;
- sa.sa_flags = SA_SIGINFO;
- sigemptyset(&sa.sa_mask);
- (void)sigaction(SIGFPE, &sa, NULL);
- }
-#else
- (void)signal(SIGFPE, fpecatch);
-#endif
+ signal(SIGFPE, fpecatch);
 
  yyin = NULL;
  symtab = makesymtab(NSYMTAB);
@@ -176,26 +92,50 @@ int main(int argc, char *argv[])
  safe = true;
  break;
  case 'f': /* next argument is program filename */
- fn = getarg(&argc, &argv, "no program filename");
- if (npfile >= maxpfile) {
- maxpfile += 20;
- pfile = realloc(pfile, maxpfile * sizeof(*pfile));
- if (pfile == NULL)
- FATAL("error allocating space for -f options");
- }
- pfile[npfile++] = fn;
- break;
+ if (argv[1][2] != 0) {  /* arg is -fsomething */
+ if (npfile >= MAX_PFILE - 1)
+ FATAL("too many -f options");
+ pfile[npfile++] = &argv[1][2];
+ } else { /* arg is -f something */
+ argc--; argv++;
+ if (argc <= 1)
+ FATAL("no program filename");
+ if (npfile >= MAX_PFILE - 1)
+ FATAL("too many -f options");
+ pfile[npfile++] = argv[1];
+ }
+ break;
  case 'F': /* set field separator */
- fs = setfs(getarg(&argc, &argv, "no field separator"));
- if (fs == NULL)
+ if (argv[1][2] != 0) { /* arg is -Fsomething */
+ if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */
+ fs = "\t";
+ else if (argv[1][2] != 0)
+ fs = &argv[1][2];
+ } else { /* arg is -F something */
+ argc--; argv++;
+ if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */
+ fs = "\t";
+ else if (argc > 1 && argv[1][0] != 0)
+ fs = &argv[1][0];
+ }
+ if (fs == NULL || *fs == '\0')
  WARNING("field separator FS is empty");
  break;
  case 'v': /* -v a=1 to be done NOW.  one -v for each */
- vn = getarg(&argc, &argv, "no variable name");
- if (isclvar(vn))
- setclvar(vn);
- else
- FATAL("invalid -v option argument: %s", vn);
+ if (argv[1][2] != 0) {  /* arg is -vsomething */
+ if (isclvar(&argv[1][2]))
+ setclvar(&argv[1][2]);
+ else
+ FATAL("invalid -v option argument: %s", &argv[1][2]);
+ } else { /* arg is -v something */
+ argc--; argv++;
+ if (argc <= 1)
+ FATAL("no variable name");
+ if (isclvar(argv[1]))
+ setclvar(argv[1]);
+ else
+ FATAL("invalid -v option argument: %s", argv[1]);
+ }
  break;
  case 'd':
  dbg = atoi(&argv[1][2]);
@@ -244,11 +184,7 @@ int main(int argc, char *argv[])
  if (!safe)
  envinit(environ);
  yyparse();
-#if 0
- // Doing this would comply with POSIX, but is not compatible with
- // other awks and with what most users expect. So comment it out.
  setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */
-#endif
  if (fs)
  *FS = qstring(fs, '\0');
    DPRINTF( ("errorflag=%d\n", errorflag) );
Index: maketab.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/maketab.c,v
retrieving revision 1.18
diff -u -p -r1.18 maketab.c
--- maketab.c 10 Jun 2020 21:05:50 -0000 1.18
+++ maketab.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: maketab.c,v 1.18 2020/06/10 21:05:50 millert Exp $ */
+/* $OpenBSD: maketab.c,v 1.16 2020/06/10 21:03:36 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -119,11 +119,12 @@ int main(int argc, char *argv[])
  char c;
  FILE *fp;
  char buf[200], name[200], def[200];
- enum { TOK_UNKNOWN, TOK_ENUM, TOK_DEFINE } tokentype = TOK_UNKNOWN;
 
  printf("#include <stdio.h>\n");
  printf("#include \"awk.h\"\n");
  printf("#include \"ytab.h\"\n\n");
+ for (i = SIZE; --i >= 0; )
+ names[i] = "";
 
  if (argc != 2) {
  fprintf(stderr, "usage: maketab YTAB_H\n");
@@ -137,28 +138,12 @@ int main(int argc, char *argv[])
  i = 0;
  while (fgets(buf, sizeof buf, fp) != NULL) {
  // 199 is sizeof(def) - 1
- if (tokentype != TOK_ENUM) {
- n = sscanf(buf, "%1c %199s %199s %d", &c, def, name,
-    &tok);
- if (n == 4 && c == '#' && strcmp(def, "define") == 0) {
- tokentype = TOK_DEFINE;
- } else if (tokentype != TOK_UNKNOWN) {
- continue;
- }
- }
- if (tokentype != TOK_DEFINE) {
- /* not a valid #define, bison uses enums now */
- n = sscanf(buf, "%199s = %d,\n", name, &tok);
- if (n != 2)
- continue;
- tokentype = TOK_ENUM;
- }
- if (strcmp(name, "YYSTYPE_IS_DECLARED") == 0) {
- tokentype = TOK_UNKNOWN;
+ n = sscanf(buf, "%1c %199s %199s %d", &c, def, name, &tok);
+ if (n != 4 || c != '#' || strcmp(def, "define") != 0)
+ continue; /* not a valid #define */
+ if (strcmp(name, "YYSTYPE_IS_DECLARED") == 0)
  continue;
- }
  if (tok < FIRSTTOKEN || tok > LASTTOKEN) {
- tokentype = TOK_UNKNOWN;
  /* fprintf(stderr, "maketab: funny token %d %s ignored\n", tok, buf); */
  continue;
  }
@@ -176,8 +161,10 @@ int main(int argc, char *argv[])
  table[p->token-FIRSTTOKEN] = p->name;
  printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE);
  for (i=0; i<SIZE; i++)
- printf("\t%s,\t/* %s */\n",
-    table[i] ? table[i] : "nullproc", names[i] ? names[i] : "");
+ if (table[i]==NULL)
+ printf("\tnullproc,\t/* %s */\n", names[i]);
+ else
+ printf("\t%s,\t/* %s */\n", table[i], names[i]);
  printf("};\n\n");
 
  printf("const char *tokname(int n)\n"); /* print a tokname() function */
Index: proto.h
===================================================================
RCS file: /cvs/src/usr.bin/awk/proto.h,v
retrieving revision 1.18
diff -u -p -r1.18 proto.h
--- proto.h 10 Jun 2020 21:06:09 -0000 1.18
+++ proto.h 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: proto.h,v 1.18 2020/06/10 21:06:09 millert Exp $ */
+/* $OpenBSD: proto.h,v 1.16 2020/06/10 21:03:56 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -47,7 +47,7 @@ extern void freetr(Node *);
 extern int hexstr(const uschar **);
 extern int quoted(const uschar **);
 extern char *cclenter(const char *);
-extern noreturn void overflo(const char *);
+extern void overflo(const char *) __attribute__((__noreturn__));
 extern void cfoll(fa *, Node *);
 extern int first(Node *);
 extern void follow(Node *);
@@ -112,7 +112,6 @@ extern double getfval(Cell *);
 extern char *getsval(Cell *);
 extern char *getpssval(Cell *);     /* for print */
 extern char *tostring(const char *);
-extern char *tostringN(const char *, size_t);
 extern char *qstring(const char *, int);
 extern Cell *catstr(Cell *, Cell *);
 
@@ -123,7 +122,7 @@ extern void growfldtab(int n);
 extern void savefs(void);
 extern int getrec(char **, int *, bool);
 extern void nextfile(void);
-extern int readrec(char **buf, int *bufsize, FILE *inf, bool isnew);
+extern int readrec(char **buf, int *bufsize, FILE *inf);
 extern char *getargv(int);
 extern void setclvar(char *);
 extern void fldbld(void);
@@ -134,14 +133,12 @@ extern int refldbld(const char *, const
 extern void recbld(void);
 extern Cell *fieldadr(int);
 extern void yyerror(const char *);
+extern void fpecatch(int);
 extern void bracecheck(void);
 extern void bcheck2(int, int, int);
-extern void SYNTAX(const char *, ...)
-    __attribute__((__format__(__printf__, 1, 2)));
-extern noreturn void FATAL(const char *, ...)
-    __attribute__((__format__(__printf__, 1, 2)));
-extern void WARNING(const char *, ...)
-    __attribute__((__format__(__printf__, 1, 2)));
+extern void SYNTAX(const char *, ...);
+extern void FATAL(const char *, ...) __attribute__((__noreturn__));
+extern void WARNING(const char *, ...);
 extern void error(void);
 extern void eprint(void);
 extern void bclass(int);
@@ -192,7 +189,7 @@ extern Cell *bltin(Node **, int);
 extern Cell *printstat(Node **, int);
 extern Cell *nullproc(Node **, int);
 extern FILE *redirect(int, Node *);
-extern FILE *openfile(int, const char *, bool *);
+extern FILE *openfile(int, const char *);
 extern const char *filename(FILE *);
 extern Cell *closefile(Node **, int);
 extern void closeall(void);
Index: run.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/run.c,v
retrieving revision 1.57
diff -u -p -r1.57 run.c
--- run.c 10 Jun 2020 21:05:50 -0000 1.57
+++ run.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: run.c,v 1.57 2020/06/10 21:05:50 millert Exp $ */
+/* $OpenBSD: run.c,v 1.55 2020/06/10 21:04:40 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -26,10 +26,7 @@ THIS SOFTWARE.
 #define DEBUG
 #include <stdio.h>
 #include <ctype.h>
-#include <wchar.h>
-#include <wctype.h>
 #include <errno.h>
-#include <fcntl.h>
 #include <setjmp.h>
 #include <limits.h>
 #include <math.h>
@@ -41,12 +38,11 @@ THIS SOFTWARE.
 #include "awk.h"
 #include "ytab.h"
 
-static void stdinit(void);
-static void flush_all(void);
+#define tempfree(x) if (istemp(x)) tfree(x); else
+
+/*
+#undef tempfree
 
-#if 1
-#define tempfree(x) do { if (istemp(x)) tfree(x); } while (/*CONSTCOND*/0)
-#else
 void tempfree(Cell *p) {
  if (p->ctype == OCELL && (p->csub < CUNK || p->csub > CFREE)) {
  WARNING("bad csub %d in Cell %d %s",
@@ -55,7 +51,7 @@ void tempfree(Cell *p) {
  if (istemp(p))
  tfree(p);
 }
-#endif
+*/
 
 /* do we really need these? */
 /* #ifdef _NFILE */
@@ -79,26 +75,29 @@ extern Awkfloat srand_seed;
 Node *winner = NULL; /* root of parse tree */
 Cell *tmps; /* free temporary cells for execution */
 
-static Cell truecell ={ OBOOL, BTRUE, 0, 0, 1.0, NUM, NULL, NULL };
+static Cell truecell ={ OBOOL, BTRUE, 0, 0, 1.0, NUM, NULL };
 Cell *True = &truecell;
-static Cell falsecell ={ OBOOL, BFALSE, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell falsecell ={ OBOOL, BFALSE, 0, 0, 0.0, NUM, NULL };
 Cell *False = &falsecell;
-static Cell breakcell ={ OJUMP, JBREAK, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell breakcell ={ OJUMP, JBREAK, 0, 0, 0.0, NUM, NULL };
 Cell *jbreak = &breakcell;
-static Cell contcell ={ OJUMP, JCONT, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell contcell ={ OJUMP, JCONT, 0, 0, 0.0, NUM, NULL };
 Cell *jcont = &contcell;
-static Cell nextcell ={ OJUMP, JNEXT, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell nextcell ={ OJUMP, JNEXT, 0, 0, 0.0, NUM, NULL };
 Cell *jnext = &nextcell;
-static Cell nextfilecell ={ OJUMP, JNEXTFILE, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell nextfilecell ={ OJUMP, JNEXTFILE, 0, 0, 0.0, NUM, NULL };
 Cell *jnextfile = &nextfilecell;
-static Cell exitcell ={ OJUMP, JEXIT, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell exitcell ={ OJUMP, JEXIT, 0, 0, 0.0, NUM, NULL };
 Cell *jexit = &exitcell;
-static Cell retcell ={ OJUMP, JRET, 0, 0, 0.0, NUM, NULL, NULL };
+static Cell retcell ={ OJUMP, JRET, 0, 0, 0.0, NUM, NULL };
 Cell *jret = &retcell;
-static Cell tempcell ={ OCELL, CTEMP, 0, EMPTY, 0.0, NUM|STR|DONTFREE, NULL, NULL };
+static Cell tempcell ={ OCELL, CTEMP, 0, "", 0.0, NUM|STR|DONTFREE, NULL };
 
 Node *curnode = NULL; /* the node being executed, for debugging */
 
+void stdinit(void);
+void flush_all(void);
+
 /* buffer memory management */
 int adjbuf(char **pbuf, int *psiz, int minlen, int quantum, char **pbptr,
  const char *whatrtn)
@@ -223,11 +222,11 @@ struct Frame { /* stack frame for awk fu
 
 struct Frame *frame = NULL; /* base of stack frames; dynamically allocated */
 int nframe = 0; /* number of frames allocated */
-struct Frame *frp = NULL; /* frame pointer. bottom level unused */
+struct Frame *fp = NULL; /* frame pointer. bottom level unused */
 
 Cell *call(Node **a, int n) /* function call.  very kludgy and fragile */
 {
- static const Cell newcopycell = { OCELL, CCOPY, 0, EMPTY, 0.0, NUM|STR|DONTFREE, NULL, NULL };
+ static Cell newcopycell = { OCELL, CCOPY, 0, "", 0.0, NUM|STR|DONTFREE, NULL };
  int i, ncall, ndef;
  int freed = 0; /* handles potential double freeing when fcn & param share a tempcell */
  Node *x;
@@ -240,21 +239,21 @@ Cell *call(Node **a, int n) /* function
  if (!isfcn(fcn))
  FATAL("calling undefined function %s", s);
  if (frame == NULL) {
- frp = frame = calloc(nframe += 100, sizeof(*frame));
+ fp = frame = calloc(nframe += 100, sizeof(*frame));
  if (frame == NULL)
  FATAL("out of space for stack frames calling %s", s);
  }
  for (ncall = 0, x = a[1]; x != NULL; x = x->nnext) /* args in call */
  ncall++;
  ndef = (int) fcn->fval; /* args in defn */
-   DPRINTF( ("calling %s, %d args (%d in defn), frp=%d\n", s, ncall, ndef, (int) (frp-frame)) );
+   DPRINTF( ("calling %s, %d args (%d in defn), fp=%d\n", s, ncall, ndef, (int) (fp-frame)) );
  if (ncall > ndef)
  WARNING("function %s called with %d args, uses only %d",
  s, ncall, ndef);
  if (ncall + ndef > NARGS)
  FATAL("function %s has %d arguments, limit %d", s, ncall+ndef, NARGS);
  for (i = 0, x = a[1]; x != NULL; i++, x = x->nnext) { /* get call args */
-   DPRINTF( ("evaluate args[%d], frp=%d:\n", i, (int) (frp-frame)) );
+   DPRINTF( ("evaluate args[%d], fp=%d:\n", i, (int) (fp-frame)) );
  y = execute(x);
  oargs[i] = y;
    DPRINTF( ("args[%d]: %s %f <%s>, t=%o\n",
@@ -271,25 +270,26 @@ Cell *call(Node **a, int n) /* function
  args[i] = gettemp();
  *args[i] = newcopycell;
  }
- frp++; /* now ok to up frame */
- if (frp >= frame + nframe) {
- int dfp = frp - frame; /* old index */
- frame = reallocarray(frame, (nframe += 100), sizeof(*frame));
+ fp++; /* now ok to up frame */
+ if (fp >= frame + nframe) {
+ int dfp = fp - frame; /* old index */
+ frame = reallocarray(frame, (nframe += 100),
+    sizeof(*frame));
  if (frame == NULL)
  FATAL("out of space for stack frames in %s", s);
- frp = frame + dfp;
+ fp = frame + dfp;
  }
- frp->fcncell = fcn;
- frp->args = args;
- frp->nargs = ndef; /* number defined with (excess are locals) */
- frp->retval = gettemp();
+ fp->fcncell = fcn;
+ fp->args = args;
+ fp->nargs = ndef; /* number defined with (excess are locals) */
+ fp->retval = gettemp();
 
-   DPRINTF( ("start exec of %s, frp=%d\n", s, (int) (frp-frame)) );
+   DPRINTF( ("start exec of %s, fp=%d\n", s, (int) (fp-frame)) );
  y = execute((Node *)(fcn->sval)); /* execute body */
-   DPRINTF( ("finished exec of %s, frp=%d\n", s, (int) (frp-frame)) );
+   DPRINTF( ("finished exec of %s, fp=%d\n", s, (int) (fp-frame)) );
 
  for (i = 0; i < ndef; i++) {
- Cell *t = frp->args[i];
+ Cell *t = fp->args[i];
  if (isarr(t)) {
  if (t->csub == CCOPY) {
  if (i >= ncall) {
@@ -318,9 +318,9 @@ Cell *call(Node **a, int n) /* function
  if (freed == 0) {
  tempfree(y); /* don't free twice! */
  }
- z = frp->retval; /* return value */
+ z = fp->retval; /* return value */
    DPRINTF( ("%s returns %g |%s| %o\n", s, getfval(z), getsval(z), z->tval) );
- frp--;
+ fp--;
  return(z);
 }
 
@@ -347,11 +347,11 @@ Cell *arg(Node **a, int n) /* nth argume
 {
 
  n = ptoi(a[0]); /* argument number, counting from 0 */
-   DPRINTF( ("arg(%d), frp->nargs=%d\n", n, frp->nargs) );
- if (n+1 > frp->nargs)
+   DPRINTF( ("arg(%d), fp->nargs=%d\n", n, fp->nargs) );
+ if (n+1 > fp->nargs)
  FATAL("argument #%d of function %s was not supplied",
- n+1, frp->fcncell->nval);
- return frp->args[n];
+ n+1, fp->fcncell->nval);
+ return fp->args[n];
 }
 
 Cell *jump(Node **a, int n) /* break, continue, next, nextfile, return */
@@ -370,14 +370,14 @@ Cell *jump(Node **a, int n) /* break, co
  if (a[0] != NULL) {
  y = execute(a[0]);
  if ((y->tval & (STR|NUM)) == (STR|NUM)) {
- setsval(frp->retval, getsval(y));
- frp->retval->fval = getfval(y);
- frp->retval->tval |= NUM;
+ setsval(fp->retval, getsval(y));
+ fp->retval->fval = getfval(y);
+ fp->retval->tval |= NUM;
  }
  else if (y->tval & STR)
- setsval(frp->retval, getsval(y));
+ setsval(fp->retval, getsval(y));
  else if (y->tval & NUM)
- setfval(frp->retval, getfval(y));
+ setfval(fp->retval, getfval(y));
  else /* can't happen */
  FATAL("bad type variable %d", y->tval);
  tempfree(y);
@@ -406,7 +406,6 @@ Cell *awkgetline(Node **a, int n) /* get
  char *buf;
  int bufsize = recsize;
  int mode;
- bool newflag;
 
  if ((buf = malloc(bufsize)) == NULL)
  FATAL("out of memory in getline");
@@ -418,12 +417,12 @@ Cell *awkgetline(Node **a, int n) /* get
  mode = ptoi(a[1]);
  if (mode == '|') /* input pipe */
  mode = LE; /* arbitrary flag */
- fp = openfile(mode, getsval(x), &newflag);
+ fp = openfile(mode, getsval(x));
  tempfree(x);
  if (fp == NULL)
  n = -1;
  else
- n = readrec(&buf, &bufsize, fp, newflag);
+ n = readrec(&buf, &bufsize, fp);
  if (n <= 0) {
  ;
  } else if (a[0] != NULL) { /* getline var <file */
@@ -797,8 +796,8 @@ Cell *sindex(Node **a, int nnn) /* inde
 
  z = gettemp();
  for (p1 = s1; *p1 != '\0'; p1++) {
- for (q = p1, p2 = s2; *p2 != '\0' && *q == *p2; q++, p2++)
- continue;
+ for (q=p1, p2=s2; *p2 != '\0' && *q == *p2; q++, p2++)
+ ;
  if (*p2 == '\0') {
  v = (Awkfloat) (p1 - s1 + 1); /* origin 1 */
  break;
@@ -830,10 +829,10 @@ int format(char **pbuf, int *pbufsize, c
  static bool have_a_format = false;
 
  if (first) {
- char xbuf[100];
+ char buf[100];
 
- snprintf(xbuf, sizeof(xbuf), "%a", 42.0);
- have_a_format = (strcmp(xbuf, "0x1.5p+5") == 0);
+ snprintf(buf, sizeof(buf), "%a", 42.0);
+ have_a_format = (strcmp(buf, "0x1.5p+5") == 0);
  first = false;
  }
 
@@ -1069,7 +1068,7 @@ Cell *arith(Node **a, int n) /* a[0] + a
  case UMINUS:
  i = -i;
  break;
- case UPLUS: /* handled by getfval(), above */
+    case UPLUS: /* handled by getfval(), above */
  break;
  case POWER:
  if (j >= 0 && modf(j, &v) == 0.0) /* pos integer exponent */
@@ -1255,8 +1254,7 @@ Cell *split(Node **a, int nnn) /* split(
 {
  Cell *x = NULL, *y, *ap;
  const char *s, *origs, *t;
- const char *fs = NULL;
- char *origfs = NULL;
+ char *fs = NULL, *origfs = NULL;
  int sep;
  char temp, num[50];
  int n, tempstat, arg3type;
@@ -1270,7 +1268,7 @@ Cell *split(Node **a, int nnn) /* split(
  fs = getsval(fsloc);
  else if (arg3type == STRING) { /* split(str,arr,"string") */
  x = execute(a[2]);
- fs = origfs = strdup(getsval(x));
+ origfs = fs = strdup(getsval(x));
  if (fs == NULL)
  FATAL("out of space in split");
  tempfree(x);
@@ -1314,7 +1312,7 @@ Cell *split(Node **a, int nnn) /* split(
  setsymtab(num, s, 0.0, STR, (Array *) ap->sval);
  setptr(patbeg, temp);
  s = patbeg + patlen;
- if (*(patbeg+patlen-1) == '\0' || *s == '\0') {
+ if (*(patbeg+patlen-1) == 0 || *s == 0) {
  n++;
  snprintf(num, sizeof(num), "%d", n);
  setsymtab(num, "", 0.0, STR, (Array *) ap->sval);
@@ -1335,16 +1333,15 @@ Cell *split(Node **a, int nnn) /* split(
  pfa = NULL;
  } else if (sep == ' ') {
  for (n = 0; ; ) {
-#define ISWS(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
- while (ISWS(*s))
+ while (*s == ' ' || *s == '\t' || *s == '\n')
  s++;
- if (*s == '\0')
+ if (*s == 0)
  break;
  n++;
  t = s;
  do
  s++;
- while (*s != '\0' && !ISWS(*s));
+ while (*s!=' ' && *s!='\t' && *s!='\n' && *s!='\0');
  temp = *s;
  setptr(s, '\0');
  snprintf(num, sizeof(num), "%d", n);
@@ -1353,22 +1350,22 @@ Cell *split(Node **a, int nnn) /* split(
  else
  setsymtab(num, t, 0.0, STR, (Array *) ap->sval);
  setptr(s, temp);
- if (*s != '\0')
+ if (*s != 0)
  s++;
  }
  } else if (sep == 0) { /* new: split(s, a, "") => 1 char/elem */
- for (n = 0; *s != '\0'; s++) {
+ for (n = 0; *s != 0; s++) {
  char buf[2];
  n++;
  snprintf(num, sizeof(num), "%d", n);
  buf[0] = *s;
- buf[1] = '\0';
+ buf[1] = 0;
  if (isdigit((uschar)buf[0]))
  setsymtab(num, buf, atof(buf), STR|NUM, (Array *) ap->sval);
  else
  setsymtab(num, buf, 0.0, STR, (Array *) ap->sval);
  }
- } else if (*s != '\0') {
+ } else if (*s != 0) {
  for (;;) {
  n++;
  t = s;
@@ -1382,7 +1379,7 @@ Cell *split(Node **a, int nnn) /* split(
  else
  setsymtab(num, t, 0.0, STR, (Array *) ap->sval);
  setptr(s, temp);
- if (*s++ == '\0')
+ if (*s++ == 0)
  break;
  }
  }
@@ -1519,71 +1516,13 @@ Cell *instat(Node **a, int n) /* for (a[
  return True;
 }
 
-static char *nawk_convert(const char *s, int (*fun_c)(int),
-    wint_t (*fun_wc)(wint_t))
-{
- char *buf      = NULL;
- char *pbuf     = NULL;
- const char *ps = NULL;
- size_t n       = 0;
- mbstate_t mbs, mbs2;
- wchar_t wc;
- size_t sz = MB_CUR_MAX;
-
- if (sz == 1) {
- buf = tostring(s);
-
- for (pbuf = buf; *pbuf; pbuf++)
- *pbuf = fun_c((uschar)*pbuf);
-
- return buf;
- } else {
- /* upper/lower character may be shorter/longer */
- buf = tostringN(s, strlen(s) * sz + 1);
-
- memset(&mbs,  0, sizeof(mbs));
- memset(&mbs2, 0, sizeof(mbs2));
-
- ps   = s;
- pbuf = buf;
- while (n = mbrtowc(&wc, ps, sz, &mbs),
-       n > 0 && n != (size_t)-1 && n != (size_t)-2)
- {
- ps += n;
-
- n = wcrtomb(pbuf, fun_wc(wc), &mbs2);
- if (n == (size_t)-1)
- FATAL("illegal wide character %s", s);
-
- pbuf += n;
- }
-
- *pbuf = '\0';
-
- if (n)
- FATAL("illegal byte sequence %s", s);
-
- return buf;
- }
-}
-
-static char *nawk_toupper(const char *s)
-{
- return nawk_convert(s, toupper, towupper);
-}
-
-static char *nawk_tolower(const char *s)
-{
- return nawk_convert(s, tolower, towlower);
-}
-
 Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg list */
 {
  Cell *x, *y;
  Awkfloat u;
  int t;
  Awkfloat tmp;
- char *buf;
+ char *p, *buf;
  Node *nextarg;
  FILE *fp;
  int status = 0;
@@ -1720,10 +1659,16 @@ Cell *bltin(Node **a, int n) /* builtin
  break;
  case FTOUPPER:
  case FTOLOWER:
- if (t == FTOUPPER)
- buf = nawk_toupper(getsval(x));
- else
- buf = nawk_tolower(getsval(x));
+ buf = tostring(getsval(x));
+ if (t == FTOUPPER) {
+ for (p = buf; *p; p++)
+ if (islower((uschar) *p))
+ *p = toupper((uschar)*p);
+ } else {
+ for (p = buf; *p; p++)
+ if (isupper((uschar) *p))
+ *p = tolower((uschar)*p);
+ }
  tempfree(x);
  x = gettemp();
  setsval(x, buf);
@@ -1733,7 +1678,7 @@ Cell *bltin(Node **a, int n) /* builtin
  if (isrec(x) || strlen(getsval(x)) == 0) {
  flush_all(); /* fflush() or fflush("") -> all */
  u = 0;
- } else if ((fp = openfile(FFLUSH, getsval(x), NULL)) == NULL)
+ } else if ((fp = openfile(FFLUSH, getsval(x))) == NULL)
  u = EOF;
  else
  u = fflush(fp);
@@ -1793,7 +1738,7 @@ FILE *redirect(int a, Node *b) /* set up
 
  x = execute(b);
  fname = getsval(x);
- fp = openfile(a, fname, NULL);
+ fp = openfile(a, fname);
  if (fp == NULL)
  FATAL("can't open file %s", fname);
  tempfree(x);
@@ -1806,14 +1751,14 @@ struct files {
  int mode; /* '|', 'a', 'w' => LE/LT, GT */
 } *files;
 
-size_t nfiles;
+int nfiles;
 
-static void stdinit(void) /* in case stdin, etc., are not constants */
+void stdinit(void) /* in case stdin, etc., are not constants */
 {
  nfiles = FOPEN_MAX;
  files = calloc(nfiles, sizeof(*files));
  if (files == NULL)
- FATAL("can't allocate file memory for %zu files", nfiles);
+ FATAL("can't allocate file memory for %u files", nfiles);
         files[0].fp = stdin;
  files[0].fname = "/dev/stdin";
  files[0].mode = LT;
@@ -1825,35 +1770,33 @@ static void stdinit(void) /* in case std
  files[2].mode = GT;
 }
 
-FILE *openfile(int a, const char *us, bool *pnewflag)
+FILE *openfile(int a, const char *us)
 {
  const char *s = us;
- size_t i;
- int m;
+ int i, m;
  FILE *fp = NULL;
 
  if (*s == '\0')
  FATAL("null file name in print or getline");
- for (i = 0; i < nfiles; i++)
- if (files[i].fname && strcmp(s, files[i].fname) == 0 &&
-    (a == files[i].mode || (a==APPEND && files[i].mode==GT) ||
-     a == FFLUSH)) {
- if (pnewflag)
- *pnewflag = false;
- return files[i].fp;
+ for (i=0; i < nfiles; i++)
+ if (files[i].fname && strcmp(s, files[i].fname) == 0) {
+ if (a == files[i].mode || (a==APPEND && files[i].mode==GT))
+ return files[i].fp;
+ if (a == FFLUSH)
+ return files[i].fp;
  }
  if (a == FFLUSH) /* didn't find it, so don't create it! */
  return NULL;
 
- for (i = 0; i < nfiles; i++)
+ for (i=0; i < nfiles; i++)
  if (files[i].fp == NULL)
  break;
  if (i >= nfiles) {
  struct files *nf;
- size_t nnf = nfiles + FOPEN_MAX;
+ int nnf = nfiles + FOPEN_MAX;
  nf = reallocarray(files, nnf, sizeof(*nf));
  if (nf == NULL)
- FATAL("cannot grow files for %s and %zu files", s, nnf);
+ FATAL("cannot grow files for %s and %d files", s, nnf);
  memset(&nf[nfiles], 0, FOPEN_MAX * sizeof(*nf));
  nfiles = nnf;
  files = nf;
@@ -1877,17 +1820,13 @@ FILE *openfile(int a, const char *us, bo
  files[i].fname = tostring(s);
  files[i].fp = fp;
  files[i].mode = m;
- if (pnewflag)
- *pnewflag = true;
- if (fp != stdin && fp != stdout && fp != stderr)
- (void) fcntl(fileno(fp), F_SETFD, FD_CLOEXEC);
  }
  return fp;
 }
 
 const char *filename(FILE *fp)
 {
- size_t i;
+ int i;
 
  for (i = 0; i < nfiles; i++)
  if (fp == files[i].fp)
@@ -1895,59 +1834,57 @@ const char *filename(FILE *fp)
  return "???";
 }
 
- Cell *closefile(Node **a, int n)
- {
- Cell *x;
- size_t i;
- bool stat;
-
- x = execute(a[0]);
- getsval(x);
- stat = true;
- for (i = 0; i < nfiles; i++) {
- if (!files[i].fname || strcmp(x->sval, files[i].fname) != 0)
- continue;
- if (ferror(files[i].fp))
- FATAL("i/o error occurred on %s", files[i].fname);
- if (files[i].mode == '|' || files[i].mode == LE)
- stat = pclose(files[i].fp) == -1;
- else
- stat = fclose(files[i].fp) == EOF;
- if (stat)
- FATAL("i/o error occurred closing %s", files[i].fname);
- if (i > 2) /* don't do /dev/std... */
- xfree(files[i].fname);
- files[i].fname = NULL; /* watch out for ref thru this */
- files[i].fp = NULL;
- }
- tempfree(x);
- x = gettemp();
- setfval(x, (Awkfloat) (stat ? -1 : 0));
- return(x);
- }
+Cell *closefile(Node **a, int n)
+{
+ Cell *x;
+ int i, stat;
+
+ x = execute(a[0]);
+ getsval(x);
+ stat = -1;
+ for (i = 0; i < nfiles; i++) {
+ if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) {
+ if (ferror(files[i].fp))
+ WARNING( "i/o error occurred on %s", files[i].fname );
+ if (files[i].mode == '|' || files[i].mode == LE)
+ stat = pclose(files[i].fp);
+ else
+ stat = fclose(files[i].fp);
+ if (stat == EOF)
+ WARNING( "i/o error occurred closing %s", files[i].fname );
+ if (i > 2) /* don't do /dev/std... */
+ xfree(files[i].fname);
+ files[i].fname = NULL; /* watch out for ref thru this */
+ files[i].fp = NULL;
+ }
+ }
+ tempfree(x);
+ x = gettemp();
+ setfval(x, (Awkfloat) stat);
+ return(x);
+}
 
 void closeall(void)
 {
- size_t i;
- bool stat = false;
+ int i, stat;
 
- for (i = 0; i < nfiles; i++) {
- if (! files[i].fp)
- continue;
- if (ferror(files[i].fp))
- FATAL( "i/o error occurred on %s", files[i].fname );
- if (files[i].mode == '|' || files[i].mode == LE)
- stat = pclose(files[i].fp) == -1;
- else
- stat = fclose(files[i].fp) == EOF;
- if (stat)
- FATAL( "i/o error occurred while closing %s", files[i].fname );
+ for (i = 0; i < FOPEN_MAX; i++) {
+ if (files[i].fp) {
+ if (ferror(files[i].fp))
+ WARNING( "i/o error occurred on %s", files[i].fname );
+ if (files[i].mode == '|' || files[i].mode == LE)
+ stat = pclose(files[i].fp);
+ else
+ stat = fclose(files[i].fp);
+ if (stat == EOF)
+ WARNING( "i/o error occurred while closing %s", files[i].fname );
+ }
  }
 }
 
-static void flush_all(void)
+void flush_all(void)
 {
- size_t i;
+ int i;
 
  for (i = 0; i < nfiles; i++)
  if (files[i].fp)
@@ -1984,7 +1921,7 @@ Cell *sub(Node **a, int nnn) /* substitu
  while (sptr < patbeg)
  *pb++ = *sptr++;
  sptr = getsval(y);
- while (*sptr != '\0') {
+ while (*sptr != 0) {
  adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "sub");
  if (*sptr == '\\') {
  backsub(&pb, &sptr);
@@ -2002,8 +1939,8 @@ Cell *sub(Node **a, int nnn) /* substitu
  sptr = patbeg + patlen;
  if ((patlen == 0 && *patbeg) || (patlen && *(sptr-1))) {
  adjbuf(&buf, &bufsz, 1+strlen(sptr)+pb-buf, 0, &pb, "sub");
- while ((*pb++ = *sptr++) != '\0')
- continue;
+ while ((*pb++ = *sptr++) != 0)
+ ;
  }
  if (pb > buf + bufsz)
  FATAL("sub result2 %.30s too big; can't happen", buf);
@@ -2046,11 +1983,11 @@ Cell *gsub(Node **a, int nnn) /* global
  pb = buf;
  rptr = getsval(y);
  do {
- if (patlen == 0 && *patbeg != '\0') { /* matched empty string */
+ if (patlen == 0 && *patbeg != 0) { /* matched empty string */
  if (mflag == 0) { /* can replace empty */
  num++;
  sptr = rptr;
- while (*sptr != '\0') {
+ while (*sptr != 0) {
  adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "gsub");
  if (*sptr == '\\') {
  backsub(&pb, &sptr);
@@ -2063,7 +2000,7 @@ Cell *gsub(Node **a, int nnn) /* global
  *pb++ = *sptr++;
  }
  }
- if (*t == '\0') /* at end */
+ if (*t == 0) /* at end */
  goto done;
  adjbuf(&buf, &bufsz, 2+pb-buf, recsize, &pb, "gsub");
  *pb++ = *t++;
@@ -2078,7 +2015,7 @@ Cell *gsub(Node **a, int nnn) /* global
  while (sptr < patbeg)
  *pb++ = *sptr++;
  sptr = rptr;
- while (*sptr != '\0') {
+ while (*sptr != 0) {
  adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "gsub");
  if (*sptr == '\\') {
  backsub(&pb, &sptr);
@@ -2091,7 +2028,7 @@ Cell *gsub(Node **a, int nnn) /* global
  *pb++ = *sptr++;
  }
  t = patbeg + patlen;
- if (patlen == 0 || *t == '\0' || *(t-1) == '\0')
+ if (patlen == 0 || *t == 0 || *(t-1) == 0)
  goto done;
  if (pb > buf + bufsz)
  FATAL("gsub result1 %.30s too big; can't happen", buf);
@@ -2100,8 +2037,8 @@ Cell *gsub(Node **a, int nnn) /* global
  } while (pmatch(pfa,t));
  sptr = t;
  adjbuf(&buf, &bufsz, 1+strlen(sptr)+pb-buf, 0, &pb, "gsub");
- while ((*pb++ = *sptr++) != '\0')
- continue;
+ while ((*pb++ = *sptr++) != 0)
+ ;
  done: if (pb < buf + bufsz)
  *pb = '\0';
  else if (*(pb-1) != '\0')
@@ -2122,13 +2059,6 @@ void backsub(char **pb_ptr, const char *
 { /* sptr[0] == '\\' */
  char *pb = *pb_ptr;
  const char *sptr = *sptr_ptr;
- static bool first = true;
- static bool do_posix = false;
-
- if (first) {
- first = false;
- do_posix = (getenv("POSIXLY_CORRECT") != NULL);
- }
 
  if (sptr[1] == '\\') {
  if (sptr[2] == '\\' && sptr[3] == '&') { /* \\\& -> \& */
@@ -2138,9 +2068,6 @@ void backsub(char **pb_ptr, const char *
  } else if (sptr[2] == '&') { /* \\& -> \ + matched */
  *pb++ = '\\';
  sptr += 2;
- } else if (do_posix) { /* \\x -> \x */
- sptr++;
- *pb++ = *sptr++;
  } else { /* \\x -> \\x */
  *pb++ = *sptr++;
  *pb++ = *sptr++;
Index: tran.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/tran.c,v
retrieving revision 1.27
diff -u -p -r1.27 tran.c
--- tran.c 10 Jun 2020 21:05:50 -0000 1.27
+++ tran.c 11 Jun 2020 11:02:48 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: tran.c,v 1.27 2020/06/10 21:05:50 millert Exp $ */
+/* $OpenBSD: tran.c,v 1.25 2020/06/10 21:04:40 millert Exp $ */
 /****************************************************************
 Copyright (C) Lucent Technologies 1997
 All Rights Reserved
@@ -345,7 +345,7 @@ void funnyvar(Cell *vp, const char *rw)
  if (vp->tval & FCN)
  FATAL("can't %s %s; it's a function.", rw, vp->nval);
  WARNING("funny variable %p: n=%s s=\"%s\" f=%g t=%o",
- (void *)vp, vp->nval, vp->sval, vp->fval, vp->tval);
+ vp, vp->nval, vp->sval, vp->fval, vp->tval);
 }
 
 char *setsval(Cell *vp, const char *s) /* set string val of a Cell */
@@ -518,17 +518,6 @@ char *tostring(const char *s) /* make a
  return(p);
 }
 
-char *tostringN(const char *s, size_t n) /* make a copy of string s */
-{
- char *p;
-
- p = malloc(n);
- if (p == NULL)
- FATAL("out of space in tostring on %s", s);
- strlcpy(p, s, n);
- return(p);
-}
-
 Cell *catstr(Cell *a, Cell *b) /* concatenate a and b */
 {
  Cell *c;
@@ -540,14 +529,12 @@ Cell *catstr(Cell *a, Cell *b) /* concat
  if (p == NULL)
  FATAL("out of space concatenating %s and %s", sa, sb);
  snprintf(p, l, "%s%s", sa, sb);
-
- l++; // add room for ' '
- char *newbuf = malloc(l);
+ char *newbuf = malloc(strlen(p) + 2);
  if (newbuf == NULL)
  FATAL("out of space concatenating %s and %s", sa, sb);
  // See string() in lex.c; a string "xx" is stored in the symbol
  // table as "xx ".
- snprintf(newbuf, l, "%s ", p);
+ sprintf(newbuf, "%s ", p);
  c = setsymtab(newbuf, p, 0.0, CON|STR|DONTFREE, symtab);
  free(p);
  free(newbuf);

awk-problem.tgz (6K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: awk: i386 broken

Stuart Henderson
On 2020/06/11 12:05, Stuart Henderson wrote:
> I am going to start a ports build with the January 5 version, i.e. the
> following backout:

This backout fixes neofetch (the problem found by cwen) as well.

Reply | Threaded
Open this post in threaded view
|

Re: awk: i386 broken

Stuart Henderson
On 2020/06/11 12:07, Stuart Henderson wrote:
> On 2020/06/11 12:05, Stuart Henderson wrote:
> > I am going to start a ports build with the January 5 version, i.e. the
> > following backout:
>
> This backout fixes neofetch (the problem found by cwen) as well.
>

The upstream version from https://github.com/onetrueawk/awk does not
show the problem with neofetch. It doesn't like the awk script from
libgpg-error so I haven't confirmed whether it fixes libgpg-error too.

Reply | Threaded
Open this post in threaded view
|

Re: awk: i386 broken

Stuart Henderson
On 2020/06/11 12:23, Stuart Henderson wrote:

> On 2020/06/11 12:07, Stuart Henderson wrote:
> > On 2020/06/11 12:05, Stuart Henderson wrote:
> > > I am going to start a ports build with the January 5 version, i.e. the
> > > following backout:
> >
> > This backout fixes neofetch (the problem found by cwen) as well.
> >
>
> The upstream version from https://github.com/onetrueawk/awk does not
> show the problem with neofetch. It doesn't like the awk script from
> libgpg-error so I haven't confirmed whether it fixes libgpg-error too.
>

This "fixes" it ...

I think the most sensible approach for now is the backout diff
in my previous mail.  Any OKs for that?


Index: lib.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/lib.c,v
retrieving revision 1.35
diff -u -p -r1.35 lib.c
--- lib.c 10 Jun 2020 21:06:09 -0000 1.35
+++ lib.c 11 Jun 2020 11:31:38 -0000
@@ -124,7 +124,7 @@ void savefs(void)
 {
  size_t len;
  if ((len = strlen(getsval(fsloc))) < len_inputFS) {
- strlcpy(inputFS, *FS, sizeof(inputFS)); /* for subsequent field splitting */
+ strcpy(inputFS, *FS);   /* for subsequent field splitting */
  return;
  }
 

Reply | Threaded
Open this post in threaded view
|

Re: awk: i386 broken

Todd C. Miller-3
On Thu, 11 Jun 2020 12:36:27 +0100, Stuart Henderson wrote:

> This "fixes" it ...
>
> I think the most sensible approach for now is the backout diff
> in my previous mail.  Any OKs for that?

The strlcpy() is wrong now that inputFS is a pointer.
It should be:

    strlcpy(inputFS, *FS, len_inputFS);

 - todd

Reply | Threaded
Open this post in threaded view
|

Re: awk: i386 broken

Stuart Henderson
On 2020/06/11 05:59, Todd C. Miller wrote:

> On Thu, 11 Jun 2020 12:36:27 +0100, Stuart Henderson wrote:
>
> > This "fixes" it ...
> >
> > I think the most sensible approach for now is the backout diff
> > in my previous mail.  Any OKs for that?
>
> The strlcpy() is wrong now that inputFS is a pointer.
> It should be:
>
>     strlcpy(inputFS, *FS, len_inputFS);
>
>  - todd
>

OK