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"