From: schwarze Date: Mon, 6 Jun 2022 19:22:54 +0000 (+0000) Subject: To better match groff parsing, reject digits and some mathematical X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=d91756bbe2574fe7893d94bae00796d9858c90d2;p=openbsd To better match groff parsing, reject digits and some mathematical operators as argument delimiters for some escape sequences that take numerical arguments, in the same way as it had already been done for \h. Argument delimiter parsing for escape sequences taking numerical arguments is not perfect yet. In particular, when a character representing a scaling unit is abused as the argument delimiter, parsing for that character becomes context-dependent, and it is no longer possible to find the end of the escape sequence without calling the full numerical expression parser, which i refrain from attempting in this commit. For now, continuing to misparse insane constructions like \Bc1c+1cc (which is valid in groff and resolves to "1" because 1c+1c = two centimeters is a valid numerical expression and 'c' is also a valid delimiter) is a small price to pay for keeping complexity at bay and for not losing focus in the ongoing series of refinements. --- diff --git a/usr.bin/mandoc/roff_escape.c b/usr.bin/mandoc/roff_escape.c index fe2a910f4aa..07bb92d68ad 100644 --- a/usr.bin/mandoc/roff_escape.c +++ b/usr.bin/mandoc/roff_escape.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_escape.c,v 1.11 2022/06/06 12:09:18 schwarze Exp $ */ +/* $OpenBSD: roff_escape.c,v 1.12 2022/06/06 19:22:54 schwarze Exp $ */ /* * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022 * Ingo Schwarze @@ -270,12 +270,14 @@ roff_escape(const char *buf, const int ln, const int aesc, goto out_sub; if (term == '\b') { - if ((buf[inam] == 'N' && isdigit((unsigned char)buf[iarg])) || - (buf[inam] == 'h' && strchr(" %&()*+-./0123456789:<=>", - buf[iarg]) != NULL)) { - iendarg = iend = iarg + 1; - rval = ESCAPE_ERROR; - goto out; + if (strchr("BDHLRSvxNhl", buf[inam]) != NULL && + strchr(" %&()*+-./0123456789:<=>", buf[iarg]) != NULL) { + if (rval != ESCAPE_EXPAND) + rval = ESCAPE_ERROR; + if (buf[inam] != 'D') { + iendarg = iend = iarg + 1; + goto out; + } } term = buf[iarg++]; } else if (term == '\0' && maxl == INT_MAX) {