diff options
| author | Ingo Schwarze <schwarze@openbsd.org> | 2022-04-24 13:38:46 +0000 |
|---|---|---|
| committer | Ingo Schwarze <schwarze@openbsd.org> | 2022-04-24 13:38:46 +0000 |
| commit | 3b18ea9139a1bdd9183db6f3ac6d174ad93b3cb3 (patch) | |
| tree | 45cef6947de3a407683fabc94f2ba1f4385da7fc /roff.c | |
| parent | c0ce7eb56abb536b1c8eaedec44f05b67e2bdf6a (diff) | |
| download | mandoc-3b18ea9139a1bdd9183db6f3ac6d174ad93b3cb3.tar.gz mandoc-3b18ea9139a1bdd9183db6f3ac6d174ad93b3cb3.zip | |
If a .shift request has a negative argument, do not use a negative array
index but use 0 instead of the argument, just like groff.
Warn about the invalid argument.
While here, fix the column number in another warning message.
Segfault reported by tb@, found with afl(1).
Diffstat (limited to 'roff.c')
| -rw-r--r-- | roff.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.381 2022/04/13 13:19:34 schwarze Exp $ */ +/* $Id: roff.c,v 1.382 2022/04/24 13:38:46 schwarze Exp $ */ /* * Copyright (c) 2010-2015, 2017-2022 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> @@ -3870,8 +3870,9 @@ static int roff_shift(ROFF_ARGS) { struct mctx *ctx; - int levels, i; + int argpos, levels, i; + argpos = pos; levels = 1; if (buf->buf[pos] != '\0' && roff_evalnum(r, ln, buf->buf, &pos, &levels, 0) == 0) { @@ -3886,9 +3887,13 @@ roff_shift(ROFF_ARGS) ctx = r->mstack + r->mstackpos; if (levels > ctx->argc) { mandoc_msg(MANDOCERR_SHIFT, - ln, pos, "%d, but max is %d", levels, ctx->argc); + ln, argpos, "%d, but max is %d", levels, ctx->argc); levels = ctx->argc; } + if (levels < 0) { + mandoc_msg(MANDOCERR_ARG_NEG, ln, argpos, "shift %d", levels); + levels = 0; + } if (levels == 0) return ROFF_IGN; for (i = 0; i < levels; i++) |
