Update tradcpp to 0.5.3.  We already had the fixed mdoc.

release 0.5.3 (20190121)
   - Fix markup typo in the man page.
   - Abort on line numbering or column numbering overflow. Line
     numbers are limited to values that fit in "unsigned int". Also
     reject input lines longer than 2^32-1 characters. It seems
     reasonable to presume that any input that violates these
     constraints is someone screwing around and not a serious attempt
     to compile or preprocess anything useful. Done in response to
     n2129, but without getting into any of the silliness found there.
   - Recognize __ia64__ for IA64 builds.
   - Recognize __aarch64__ for 64-bit ARM builds, as sent in by
     various people.
   - Recognize __riscv__ and __riscv64__ for risc-v builds.

Index: config.h
===================================================================
RCS file: /cvs/src/libexec/tradcpp/config.h,v
retrieving revision 1.1
diff -u -p -r1.1 config.h
--- config.h    30 Jul 2014 16:33:11 -0000      1.1
+++ config.h    21 Aug 2019 04:02:28 -0000
@@ -124,6 +124,22 @@
 #define CONFIG_CPU "__ppc64__"
 #elif defined(__ARM__)
 #define CONFIG_CPU "__ARM__"
+#elif defined(__AARCH64__)
+#define CONFIG_CPU "__AARCH64__"
+#elif defined(__aarch64__)
+#define CONFIG_CPU "__aarch64__"
+#elif defined(__RISCV__)
+#define CONFIG_CPU "__RISCV__"
+#elif defined(__riscv__)
+#define CONFIG_CPU "__riscv__"
+#elif defined(__RISCV64__)
+#define CONFIG_CPU "__RISCV64__"
+#elif defined(__riscv64__)
+#define CONFIG_CPU "__riscv64__"
+#elif defined(__riscv64)
+#define CONFIG_CPU "__riscv64"
+#elif defined(__ia64__)
+#define CONFIG_CPU "__ia64__"
 #else
 /* let it go */
 #endif
Index: directive.c
===================================================================
RCS file: /cvs/src/libexec/tradcpp/directive.c,v
retrieving revision 1.2
diff -u -p -r1.2 directive.c
--- directive.c 2 Sep 2018 08:28:05 -0000       1.2
+++ directive.c 21 Aug 2019 04:02:28 -0000
@@ -114,7 +114,7 @@ oneword(const char *what, struct place *
 
        pos = strcspn(line, ws);
        if (line[pos] != '\0') {
-               p2->column += pos;
+               place_addcolumns(p2, pos);
                complain(p2, "Garbage after %s argument", what);
                complain_fail();
                line[pos] = '\0';
@@ -348,13 +348,13 @@ d_define(struct lineplace *lp, struct pl
                argpos = pos;
                pos = pos + strcspn(line+pos, "()");
                if (line[pos] == '(') {
-                       p2->column += pos;
+                       place_addcolumns(p2, pos);
                        complain(p2, "Left parenthesis in macro parameters");
                        complain_fail();
                        return;
                }
                if (line[pos] != ')') {
-                       p2->column += pos;
+                       place_addcolumns(p2, pos);
                        complain(p2, "Unclosed macro parameter list");
                        complain_fail();
                        return;
@@ -378,10 +378,10 @@ d_define(struct lineplace *lp, struct pl
        pos += strspn(line+pos, ws);
 
        p3 = *p2;
-       p3.column += argpos;
+       place_addcolumns(&p3, argpos);
 
        p4 = *p2;
-       p4.column += pos;
+       place_addcolumns(&p4, pos);
 
        if (argpos) {
                debuglog(&lp->current, "Defining %s()", line);
@@ -490,7 +490,8 @@ d_line(struct lineplace *lp, struct plac
        errno = 0;
        val = strtoul(text, &moretext, 10);
        if (errno) {
-               complain(&lp->current, "No line number in #line directive");
+               complain(&lp->current,
+                        "Invalid line number in #line directive");
                goto fail;
        }
 #if UINT_MAX < ULONG_MAX
@@ -502,7 +503,7 @@ d_line(struct lineplace *lp, struct plac
 #endif
        moretext += strspn(moretext, ws);
        moretextlen = strlen(moretext);
-       lp->current.column += (moretext - text);
+       place_addcolumns(&lp->current, moretext - text);
 
        if (moretextlen > 2 &&
            moretext[0] == '"' && moretext[moretextlen-1] == '"') {
@@ -610,7 +611,7 @@ directive_gotdirective(struct lineplace 
                                return;
                        }
                        skip = len + strspn(line+len, ws);
-                       p2.column += skip;
+                       place_addcolumns(&p2, skip);
                        line += skip;
 
                        len = strlen(line);
@@ -667,10 +668,10 @@ directive_scancomments(const struct line
                        pos++;
                }
                if (line[pos] == '\n') {
-                       p2.line++;
+                       place_addlines(&p2, 1);
                        p2.column = 0;
                } else {
-                       p2.column++;
+                       place_addcolumns(&p2, 1);
                }
        }
 
@@ -692,13 +693,13 @@ directive_gotline(struct lineplace *lp, 
        if (len > 0 && line[0] == '#') {
                skip = 1 + strspn(line + 1, ws);
                assert(skip <= len);
-               lp->current.column += skip;
+               place_addcolumns(&lp->current, skip);
                assert(line[len] == '\0');
                directive_gotdirective(lp, line+skip /*, length = len-skip */);
-               lp->current.column += len-skip;
+               place_addcolumns(&lp->current, len-skip);
        } else if (ifstate->curtrue) {
                macro_sendline(&lp->current, line, len);
-               lp->current.column += len;
+               place_addcolumns(&lp->current, len);
        }
 }
 
Index: eval.c
===================================================================
RCS file: /cvs/src/libexec/tradcpp/eval.c,v
retrieving revision 1.2
diff -u -p -r1.2 eval.c
--- eval.c      2 Sep 2018 08:28:05 -0000       1.2
+++ eval.c      21 Aug 2019 04:02:28 -0000
@@ -708,29 +708,29 @@ tokenize(struct place *p, char *expr)
        while (expr[pos] != '\0') {
                len = strspn(expr+pos, ws);
                pos += len;
-               p->column += len;
+               place_addcolumns(p, len);
                /* trailing whitespace is supposed to have been pruned */
                assert(expr[pos] != '\0');
                if (check_word(p, expr, pos, &len)) {
                        pos += len;
-                       p->column += len;
+                       place_addcolumns(p, len);
                        continue;
                }
                if (check_tokens_2(p, expr, pos)) {
                        pos += 2;
-                       p->column += 2;
+                       place_addcolumns(p, 2);
                        continue;
                }
                if (check_tokens_1(p, expr, pos)) {
                        pos++;
-                       p->column++;
+                       place_addcolumns(p, 1);
                        continue;
                }
                complain(p, "Invalid character %u in #if-expression",
                         (unsigned char)expr[pos]);
                complain_fail();
                pos++;
-               p->column++;
+               place_addcolumns(p, 1);
        }
        token(p, T_EOF, 0);
 }
Index: files.c
===================================================================
RCS file: /cvs/src/libexec/tradcpp/files.c,v
retrieving revision 1.5
diff -u -p -r1.5 files.c
--- files.c     28 Jun 2019 13:47:33 -0000      1.5
+++ files.c     21 Aug 2019 04:02:28 -0000
@@ -163,6 +163,10 @@ countnls(const char *buf, size_t start, 
        for (i=start; i<limit; i++) {
                if (buf[i] == '\n') {
                        count++;
+                       if (count == 0) {
+                               /* just return the max and error downstream */
+                               return count - 1;
+                       }
                }
        }
        return count;
@@ -209,6 +213,12 @@ file_read(const struct placefile *pf, in
                                /* need bigger buffer */
                                buf = dorealloc(buf, bufmax, bufmax*2);
                                bufmax = bufmax*2;
+                               /* just in case someone's screwing around */
+                               if (bufmax > 0xffffffff) {
+                                       complain(&places.current,
+                                                "Input line too long");
+                                       die();
+                               }
                        }
 
                        if (ateof) {
@@ -231,7 +241,7 @@ file_read(const struct placefile *pf, in
                                /* eof in middle of line */
                                ateof = true;
                                ptmp = places.current;
-                               ptmp.column += bufend - linestart;
+                               place_addcolumns(&ptmp, bufend - linestart);
                                if (buf[bufend - 1] == '\n') {
                                        complain(&ptmp, "Unclosed comment");
                                        complain_fail();
@@ -257,7 +267,7 @@ file_read(const struct placefile *pf, in
                assert(buf[lineend] == '\n');
                buf[lineend] = '\0';
                nextlinestart = lineend+1;
-               places.nextline.line++;
+               place_addlines(&places.nextline, 1);
 
                /* check for CR/NL */
                if (lineend > 0 && buf[lineend-1] == '\r') {
@@ -284,7 +294,8 @@ file_read(const struct placefile *pf, in
                assert(buf[lineend] == '\0');
 
                /* count how many commented-out newlines we swallowed */
-               places.nextline.line += countnls(buf, linestart, lineend);
+               place_addlines(&places.nextline,
+                              countnls(buf, linestart, lineend));
 
                /* process the line (even if it's empty) */
                directive_gotline(&places, buf+linestart, lineend-linestart);
Index: macro.c
===================================================================
RCS file: /cvs/src/libexec/tradcpp/macro.c,v
retrieving revision 1.3
diff -u -p -r1.3 macro.c
--- macro.c     2 Sep 2018 08:28:05 -0000       1.3
+++ macro.c     21 Aug 2019 04:02:28 -0000
@@ -523,7 +523,7 @@ macro_parse_parameters(struct macro *m, 
        while (params != NULL) {
                len = strspn(params, ws);
                params += len;
-               p->column += len;
+               place_addcolumns(p, len);
                s = strchr(params, ',');
                if (s) {
                        len = s-params;
@@ -541,7 +541,7 @@ macro_parse_parameters(struct macro *m, 
                        stringarray_add(&m->params, param, NULL);
                }
                params = s;
-               p->column += len;
+               place_addcolumns(p, len);
        }
 }
 
Index: main.c
===================================================================
RCS file: /cvs/src/libexec/tradcpp/main.c,v
retrieving revision 1.4
diff -u -p -r1.4 main.c
--- main.c      2 Sep 2018 08:28:05 -0000       1.4
+++ main.c      21 Aug 2019 04:02:28 -0000
@@ -156,7 +156,7 @@ commandline_def(const struct place *p, c
 
        if (val) {
                p2 = *p;
-               p2.column += strlen(str);
+               place_addcolumns(&p2, strlen(str));
        } else {
                place_setbuiltin(&p2, 1);
        }
Index: place.c
===================================================================
RCS file: /cvs/src/libexec/tradcpp/place.c,v
retrieving revision 1.2
diff -u -p -r1.2 place.c
--- place.c     2 Sep 2018 08:28:05 -0000       1.2
+++ place.c     21 Aug 2019 04:02:28 -0000
@@ -193,6 +193,34 @@ place_setfilestart(struct place *p, cons
        p->column = 1;
 }
 
+void
+place_addcolumns(struct place *p, unsigned cols)
+{
+       unsigned newcol;
+
+       newcol = p->column + cols;
+       if (newcol < p->column) {
+               /* overflow (use the old place to complain) */
+               complain(p, "Column numbering overflow");
+               die();
+       }
+       p->column = newcol;
+}
+
+void
+place_addlines(struct place *p, unsigned lines)
+{
+       unsigned nextline;
+
+       nextline = p->line + lines;
+       if (nextline < p->line) {
+               /* overflow (use the old place to complain) */
+               complain(p, "Line numbering overflow");
+               die();
+       }
+       p->line = nextline;
+}
+
 const char *
 place_getname(const struct place *p)
 {
Index: place.h
===================================================================
RCS file: /cvs/src/libexec/tradcpp/place.h,v
retrieving revision 1.2
diff -u -p -r1.2 place.h
--- place.h     2 Sep 2018 08:28:05 -0000       1.2
+++ place.h     21 Aug 2019 04:02:28 -0000
@@ -53,6 +53,9 @@ void place_setbuiltin(struct place *p, u
 void place_setcommandline(struct place *p, unsigned word, unsigned column);
 void place_setfilestart(struct place *p, const struct placefile *pf);
 
+void place_addcolumns(struct place *, unsigned cols);
+void place_addlines(struct place *, unsigned lines);
+
 const char *place_getname(const struct place *);
 const char *place_getparsedir(const struct place *incplace);
 bool place_eq(const struct place *, const struct place *);
Index: version.h
===================================================================
RCS file: /cvs/src/libexec/tradcpp/version.h,v
retrieving revision 1.2
diff -u -p -r1.2 version.h
--- version.h   2 Sep 2018 08:28:05 -0000       1.2
+++ version.h   21 Aug 2019 04:02:28 -0000
@@ -29,5 +29,5 @@
 
 #define VERSION_MAJOR  "0"
 #define VERSION_MINOR  "5"
-#define VERSION_STRING "0.5.2"
-#define VERSION_LONG   "NetBSD tradcpp 0.5.2"
+#define VERSION_STRING "0.5.3"
+#define VERSION_LONG   "NetBSD tradcpp 0.5.3"

Reply via email to