]> git.cameronkatri.com Git - mandoc.git/commitdiff
Prevent negative arguments to the .ll request from causing integer
authorIngo Schwarze <schwarze@openbsd.org>
Thu, 20 Nov 2014 13:56:20 +0000 (13:56 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Thu, 20 Nov 2014 13:56:20 +0000 (13:56 +0000)
underflow.  Found while preparing an audit of termp.rmargin.

Overflow can also happen, but i see no sane way to deal with it,
so just let it happen.  It doesn't happen for any sane input anyway,
groff behaviour is undefined, and the resulting values are legal,
even though they are useless.

term_ascii.c
term_ps.c

index 6c2904537dd13271d6c93a34a4c74803f8b30baa..71d8af4c6c7905375c7e09cd6ecfd6768d951158 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: term_ascii.c,v 1.39 2014/10/28 18:49:33 schwarze Exp $ */
+/*     $Id: term_ascii.c,v 1.40 2014/11/20 13:56:20 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -159,12 +159,14 @@ ascii_setwidth(struct termp *p, int iop, size_t width)
 {
 
        p->rmargin = p->defrmargin;
-       if (0 < iop)
+       if (iop > 0)
                p->defrmargin += width;
-       else if (0 > iop)
+       else if (iop == 0)
+               p->defrmargin = width ? width : p->lastrmargin;
+       else if (p->defrmargin > width)
                p->defrmargin -= width;
        else
-               p->defrmargin = width ? width : p->lastrmargin;
+               p->defrmargin = 0;
        p->lastrmargin = p->rmargin;
        p->rmargin = p->maxrmargin = p->defrmargin;
 }
index ec6d9b594493d959726bbbdfcb12fdf5bf30e179..2f0b434a2e80e0a330564c320210af1c186d0ae2 100644 (file)
--- a/term_ps.c
+++ b/term_ps.c
@@ -1,4 +1,4 @@
-/*     $Id: term_ps.c,v 1.68 2014/10/28 17:36:19 schwarze Exp $ */
+/*     $Id: term_ps.c,v 1.69 2014/11/20 13:56:20 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -635,12 +635,14 @@ ps_setwidth(struct termp *p, int iop, size_t width)
        size_t   lastwidth;
 
        lastwidth = p->ps->width;
-       if (0 < iop)
+       if (iop > 0)
                p->ps->width += width;
-       else if (0 > iop)
+       else if (iop == 0)
+               p->ps->width = width ? width : p->ps->lastwidth;
+       else if (p->ps->width > width)
                p->ps->width -= width;
        else
-               p->ps->width = width ? width : p->ps->lastwidth;
+               p->ps->width = 0;
        p->ps->lastwidth = lastwidth;
 }