]> git.cameronkatri.com Git - mandoc.git/commitdiff
Fix two issues with .po (page offset) formatting:
authorIngo Schwarze <schwarze@openbsd.org>
Thu, 3 Sep 2020 20:43:15 +0000 (20:43 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Thu, 3 Sep 2020 20:43:15 +0000 (20:43 +0000)
1. Truncate excessive offsets to a width reasonable in the context
of manual pages instead of printing excessively long lines
and sometimes causing assertion failures;
found in an afl run performed by Jan Schreiber <jes at posteo dot de>.
2. Remember both the requested and the applied page offset; otherwise,
subtracting an excessive width, then adding it again, would end up
with an incorrectly large offset.
While here, simplify the code by reverting the previous offset up front,
and also add some comments to make the general ideas easier to understand.

regress/roff/po/Makefile
regress/roff/po/range.in [new file with mode: 0644]
regress/roff/po/range.out_ascii [new file with mode: 0644]
roff_term.c

index dabc7c9e6d37722dac27c50550d638bb84acfa69..fa2f5774ca59769bf98f397425676b42587eeee9 100644 (file)
@@ -1,5 +1,13 @@
-# $OpenBSD: Makefile,v 1.1 2017/05/08 15:33:43 schwarze Exp $
+# $OpenBSD: Makefile,v 1.2 2020/09/03 20:33:20 schwarze Exp $
 
-REGRESS_TARGETS        = basic-mdoc
+REGRESS_TARGETS        = basic-mdoc range
+
+# groff-1.22.4 defect:
+# - Negative page objects sometimes result in output lines starting
+#   with backspace characters.
+# - Excessive page offsets cause excessive line lengths
+#   instead of being truncated to resonable widths.
+
+SKIP_GROFF      = range
 
 .include <bsd.regress.mk>
diff --git a/regress/roff/po/range.in b/regress/roff/po/range.in
new file mode 100644 (file)
index 0000000..e90d0d4
--- /dev/null
@@ -0,0 +1,24 @@
+.\" $OpenBSD: range.in,v 1.1 2020/09/03 20:33:20 schwarze Exp $
+.Dd $Mdocdate: September 3 2020 $
+.Dt PO-RANGE 1
+.Os
+.Sh NAME
+.Nm po-range
+.Nd page offsets out of range
+.Sh DESCRIPTION
+initial text
+.Pp
+.po -10n
+too small
+.Pp
+.po +10n
+back in range
+.Pp
+.po 80n
+too large
+.Pp
+.po -70n
+back in range
+.Pp
+.po 0
+final text
diff --git a/regress/roff/po/range.out_ascii b/regress/roff/po/range.out_ascii
new file mode 100644 (file)
index 0000000..cc55df2
--- /dev/null
@@ -0,0 +1,19 @@
+PO-RANGE(1)                 General Commands Manual                PO-RANGE(1)
+
+N\bNA\bAM\bME\bE
+     p\bpo\bo-\b-r\bra\ban\bng\bge\be - page offsets out of range
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     initial text
+
+too small
+
+     back in range
+
+                                                                 too large
+
+               back in range
+
+     final text
+
+OpenBSD                        September 3, 2020                       OpenBSD
index ebfb75ef0810ef67b8adbd950c52f186f07b9bb4..7f5058a43707161ef93ce6413b276a1d8c1a6257 100644 (file)
@@ -1,6 +1,6 @@
-/* $Id: roff_term.c,v 1.21 2020/09/03 17:42:15 schwarze Exp $ */
+/* $OpenBSD: roff_term.c,v 1.20 2020/09/03 17:37:06 schwarze Exp $ */
 /*
- * Copyright (c) 2010,2014,2015,2017-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010,2014,2015,2017-2020 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -157,9 +157,13 @@ static void
 roff_term_pre_po(ROFF_TERM_ARGS)
 {
        struct roffsu    su;
-       static int       po, polast;
+       static int       po, pouse, polast;
        int              ponew;
 
+       /* Revert the currently active page offset. */
+       p->tcol->offset -= pouse;
+
+       /* Determine the requested page offset. */
        if (n->child != NULL &&
            a2roffsu(n->child->string, &su, SCALE_EM) != NULL) {
                ponew = term_hen(p, &su);
@@ -168,11 +172,15 @@ roff_term_pre_po(ROFF_TERM_ARGS)
                        ponew += po;
        } else
                ponew = polast;
+
+       /* Remeber both the previous and the newly requested offset. */
        polast = po;
        po = ponew;
 
-       ponew = po - polast + (int)p->tcol->offset;
-       p->tcol->offset = ponew > 0 ? ponew : 0;
+       /* Truncate to the range [-offset, 60], remember, and apply it. */
+       pouse = po >= 60 ? 60 :
+           po < -(int)p->tcol->offset ? -p->tcol->offset : po;
+       p->tcol->offset += pouse;
 }
 
 static void