diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-12-16 23:44:41 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-12-16 23:44:41 +0000 |
commit | 049de3868dfab614357f07d4d25fa4b7c2e4b7f5 (patch) | |
tree | 3e9d18c4db18753163000049b6cfa2223383e920 | |
parent | 1c5b69096dc052617e48d25e13d9e3875b100302 (diff) | |
download | mandoc-049de3868dfab614357f07d4d25fa4b7c2e4b7f5.tar.gz |
Ignore mdoc(7) and man(7) macros inside tbl(7) code because they
would abort the table in an unclean way, causing assertion failures
found by jsg@.
-rw-r--r-- | mandoc.1 | 1 | ||||
-rw-r--r-- | mandoc.h | 1 | ||||
-rw-r--r-- | read.c | 1 | ||||
-rw-r--r-- | roff.c | 23 |
4 files changed, 22 insertions, 4 deletions
@@ -1266,6 +1266,7 @@ keeps the code more readable. .It "ignore data in cell" .It "data block still open" .It "ignoring extra data cells" +.It "ignoring macro in table" .El .Ss "Errors related to roff, mdoc, and man code" .Bl -ohang @@ -144,6 +144,7 @@ enum mandocerr { MANDOCERR_TBLIGNDATA, /* ignore data in cell */ MANDOCERR_TBLBLOCK, /* data block still open */ MANDOCERR_TBLEXTRADAT, /* ignoring extra data cells */ + MANDOCERR_TBLMACRO, /* ignoring macro in table: macro */ /* related to document structure and macros */ MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */ @@ -188,6 +188,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "ignore data in cell", "data block still open", "ignoring extra data cells", + "ignoring macro in table", /* related to document structure and macros */ "input stack limit exceeded, infinite loop?", @@ -730,6 +730,7 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs) enum rofft t; enum rofferr e; int pos; /* parse point */ + int spos; /* saved parse point for messages */ int ppos; /* original offset in buf->buf */ int ctl; /* macro line (boolean) */ @@ -800,15 +801,29 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs) return((*roffs[t].sub)(r, t, buf, ln, ppos, pos, offs)); } + /* No scope is open. This is a new request or macro. */ + + spos = pos; + t = roff_parse(r, buf->buf, &pos, ln, ppos); + + /* Tables ignore most macros. */ + + if (r->tbl != NULL && (t == ROFF_MAX || t == ROFF_TS)) { + mandoc_msg(MANDOCERR_TBLMACRO, r->parse, + ln, pos, buf->buf + spos); + return(ROFF_IGN); + } + /* - * Lastly, as we've no scope open, try to look up and execute - * the new macro. If no macro is found, simply return and let - * the compilers handle it. + * This is neither a roff request nor a user-defined macro. + * Let the standard macro set parsers handle it. */ - if ((t = roff_parse(r, buf->buf, &pos, ln, ppos)) == ROFF_MAX) + if (t == ROFF_MAX) return(ROFF_CONT); + /* Execute a roff request or a user defined macro. */ + assert(roffs[t].proc); return((*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs)); } |