Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Jul 2019 22:31:24 +0300
From:      Eygene Ryabinkin <rea@freebsd.org>
To:        freebsd-current@FreeBSD.org, bapt@FreeBSD.org
Subject:   [CFT][patch] mandoc: don't segfault on empty tbl(1) continuation blocks
Message-ID:  <20190716193124.yrrntrtah22aky5n@phoenix.codelabs.ru>

next in thread | raw e-mail | index | archive | help

--gz7utc52kvukndjs
Content-Type: multipart/mixed; boundary="cds6ufi5oa7zoiin"
Content-Disposition: inline


--cds6ufi5oa7zoiin
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Good day.

Attached is the patch that makes built-in tbl(1) processor in mandoc
to avoid dumping core when it renders the table with empty "T{ T}"
block and horizontally-ruled table.

The simplest way to reproduce the issue is to either
 - run 'man notmuch-config' with mail/notmuch installed;
 - run 'mandoc tests/empty-table-cdata.1' against the attached
   test-only manpage.

With the patch applied, one can utilize 'make check': regression
test was added.  Perhaps an invocation of
{{{
mtree -deU -f /usr/src/etc/mtree/BSD.tests.dist -p /usr/tests
}}}
will be needed to run 'make check' without remaking/installing
the world.

The patch is for the fresh -CURRENT.  Be interested in any results
of its application and usage.

Thanks!

P.S.: please, CC me: I am not subscribed to the list.
--=20
Eygene Ryabinkin                                        ,,,^..^,,,
[ Life's unfair - but root password helps!           | codelabs.ru ]
[ 82FE 06BC D497 C0DE 49EC  4FF0 16AF 9EAE 8152 ECFB | freebsd.org ]

--cds6ufi5oa7zoiin
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="mandoc-fix-empty-cdata-crash.patch"
Content-Transfer-Encoding: quoted-printable

mandoc: fix built-in tbl(1) processing of empty continuation blocks

Empty "T{ T}" (continuation) blocks produce NULL-valued string
for their data block: getdata() allocates structure with string
set to NULL and tbl_cdata() will just return when it sees
the end ("T}") of the block without any further manipulations
with dat->string.

This is completely legal; moreover, tbl.h specifies that for
'struct tbl_dat' the 'string' member is NULL when entry type
is not TBL_DATA_DATA.  This is not so all the time, but one
shouldn't rely on this.

The segfault in question was plain NULL pointer dereference
triggered from tbl_term.c::tbl_hrule().

Added check for dpn->pos not being TBL_DATA_DATA.  Also added
regression test to find such problems in the future.

The real-world case when manpage was provoking core dump
is notmuch-config.1 for mail/notmuch port: it is auto-generated
=66rom reStructuredText, so has empty blocks at the places where
it would be enough just to specify the empty value.

Index: usr.bin/mandoc/Makefile
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- usr.bin/mandoc/Makefile	(revision 349971)
+++ usr.bin/mandoc/Makefile	(working copy)
@@ -101,4 +101,7 @@
 CFLAGS.gcc+=3D	-Wno-format
 LIBADD=3D	openbsd z
=20
+HAS_TESTS=3D
+SUBDIR.${MK_TESTS}+=3D tests
+
 .include <bsd.prog.mk>
Index: usr.bin/mandoc/tests/Makefile
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- usr.bin/mandoc/tests/Makefile	(nonexistent)
+++ usr.bin/mandoc/tests/Makefile	(working copy)
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+PACKAGE=3D	tests
+
+${PACKAGE}FILES+=3D	empty-table-cdata.1
+
+ATF_TESTS_SH+=3D		regression-tests
+
+BINDIR=3D	${TESTSDIR}
+
+.include <bsd.test.mk>

Property changes on: usr.bin/mandoc/tests/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: usr.bin/mandoc/tests/Makefile.depend
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- usr.bin/mandoc/tests/Makefile.depend	(nonexistent)
+++ usr.bin/mandoc/tests/Makefile.depend	(working copy)
@@ -0,0 +1,11 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS =3D \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} =3D=3D ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif

Property changes on: usr.bin/mandoc/tests/Makefile.depend
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: usr.bin/mandoc/tests/empty-table-cdata.1
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- usr.bin/mandoc/tests/empty-table-cdata.1	(nonexistent)
+++ usr.bin/mandoc/tests/empty-table-cdata.1	(working copy)
@@ -0,0 +1,21 @@
+.\" $FreeBSD$
+.
+.TH EMPTY-TABLE-CDATA 1 1970-01-01
+.SH Empty table cdata test for tbl processor
+.
+.PP
+The following table should not make mandoc to dump core:
+.
+.TS
+|l|l|.
+_
+A	test
+_
+table	T{
+T}
+_
+.TE
+.
+.SH Author
+.PP
+Eygene Ryabinkin, <rea@FreeBSD.org>.

Property changes on: usr.bin/mandoc/tests/empty-table-cdata.1
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: usr.bin/mandoc/tests/regression-tests.sh
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- usr.bin/mandoc/tests/regression-tests.sh	(nonexistent)
+++ usr.bin/mandoc/tests/regression-tests.sh	(working copy)
@@ -0,0 +1,20 @@
+# $FreeBSD$
+
+
+SRCDIR=3D$(atf_get_srcdir)
+
+
+atf_test_case empty_table_cdata
+empty_table_cdata_head() {
+	atf_set "descr" "Normal processing of empty T{ T} blocks in tables"
+}
+empty_table_cdata_body() {
+	local mandoc=3D$(atf_config_get usr.bin.mandoc.test_mandoc /usr/bin/mando=
c)
+
+	atf_check -s exit: -o not-empty $mandoc "$SRCDIR"/empty-table-cdata.1
+}
+
+
+atf_init_test_cases() {
+	atf_add_test_case empty_table_cdata
+}

Property changes on: usr.bin/mandoc/tests/regression-tests.sh
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: etc/mtree/BSD.tests.dist
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- etc/mtree/BSD.tests.dist	(revision 349971)
+++ etc/mtree/BSD.tests.dist	(working copy)
@@ -1004,6 +1004,8 @@
         ..
         m4
         ..
+        mandoc
+        ..
         mkimg
         ..
         ncal
Index: contrib/mandoc/tbl_term.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- contrib/mandoc/tbl_term.c	(revision 349971)
+++ contrib/mandoc/tbl_term.c	(working copy)
@@ -626,7 +626,8 @@
=20
 		lw =3D cpp =3D=3D NULL || cpn =3D=3D NULL ||
 		    (cpn->pos !=3D TBL_CELL_DOWN &&
-		     (dpn =3D=3D NULL || strcmp(dpn->string, "\\^") !=3D 0))
+		     (dpn =3D=3D NULL || dpn->pos !=3D TBL_DATA_DATA ||
+		      strcmp(dpn->string, "\\^") !=3D 0))
 		    ? hw : 0;
 		tbl_direct_border(tp, BHORIZ * lw,
 		    col->width + col->spacing / 2);
@@ -670,7 +671,8 @@
=20
 		rw =3D cpp =3D=3D NULL || cpn =3D=3D NULL ||
 		    (cpn->pos !=3D TBL_CELL_DOWN &&
-		     (dpn =3D=3D NULL || strcmp(dpn->string, "\\^") !=3D 0))
+		     (dpn =3D=3D NULL || dpn->pos !=3D TBL_DATA_DATA ||
+		      strcmp(dpn->string, "\\^") !=3D 0))
 		    ? hw : 0;
=20
 		/* The line crossing at the end of this column. */

--cds6ufi5oa7zoiin
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="empty-table-cdata.1"

.\" $FreeBSD$
.
.TH EMPTY-TABLE-CDATA 1 1970-01-01
.SH Empty table cdata test for tbl processor
.
.PP
The following table should not make mandoc to dump core:
.
.TS
|l|l|.
_
A	test
_
table	T{
T}
_
.TE
.
.SH Author
.PP
Eygene Ryabinkin, <rea@FreeBSD.org>.

--cds6ufi5oa7zoiin--

--gz7utc52kvukndjs
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iNUEABEKAH0WIQSC/ga81JfA3knsT/AWr56ugVLs+wUCXS4mB18UgAAAAAAuAChp
c3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9yc2VtYW4ubmV0ODJG
RTA2QkNENDk3QzBERTQ5RUM0RkYwMTZBRjlFQUU4MTUyRUNGQgAKCRAWr56ugVLs
+3yMAP9Qi6AhAa+Te9ckPanrkwn1yQlkNJ7Ijzpk2uqLr6x5qQD/Wv9q8un/WYxm
eaxYMUayUFoVumCdva9hBw9yPrTa5V4=
=lWaK
-----END PGP SIGNATURE-----

--gz7utc52kvukndjs--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190716193124.yrrntrtah22aky5n>