summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2011-12-10 22:01:04 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2011-12-10 22:01:04 +0000
commitdcc62d159c5ee97a8343d997a7b6f6346fc14adb (patch)
treea549bbc6a48384fcd2a41d42bdf33d4630298f73 /usr.bin/mandoc
parent307923071e1eb557f27b19f1d1ec1a9af04684d1 (diff)
Avoid leaking index records:
Before allocating a record for a file, first make sure we actually want to use the file.
Diffstat (limited to 'usr.bin/mandoc')
-rw-r--r--usr.bin/mandoc/mandocdb.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/usr.bin/mandoc/mandocdb.c b/usr.bin/mandoc/mandocdb.c
index 1f68b9a6469..e2c7db6bedc 100644
--- a/usr.bin/mandoc/mandocdb.c
+++ b/usr.bin/mandoc/mandocdb.c
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.c,v 1.23 2011/12/10 16:53:38 schwarze Exp $ */
+/* $Id: mandocdb.c,v 1.24 2011/12/10 22:01:03 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -516,29 +516,15 @@ index_merge(const struct of *of, struct mparse *mp,
fn = of->fname;
/*
- * Reclaim an empty index record, if available.
+ * Try interpreting the file as mdoc(7) or man(7)
+ * source code, unless it is already known to be
+ * formatted. Fall back to formatted mode.
*/
- if (reccur > 0) {
- --reccur;
- rec = recs[(int)reccur];
- } else if (maxrec > 0) {
- rec = maxrec;
- maxrec = 0;
- } else
- rec++;
-
mparse_reset(mp);
- hash_reset(&hash);
mdoc = NULL;
man = NULL;
- /*
- * Try interpreting the file as mdoc(7) or man(7)
- * source code, unless it is already known to be
- * formatted. Fall back to formatted mode.
- */
-
if ((MANDOC_SRC & of->src_form ||
! (MANDOC_FORM & of->src_form)) &&
MANDOCLEVEL_FATAL > mparse_readfd(mp, -1, fn))
@@ -613,8 +599,12 @@ index_merge(const struct of *of, struct mparse *mp,
sv = dbuf->len;
- /* Fix the record number in the btree value. */
+ /*
+ * Collect keyword/mask pairs.
+ * Each pair will become a new btree node.
+ */
+ hash_reset(&hash);
if (mdoc)
pmdoc_node(hash, buf, dbuf,
mdoc_node(mdoc), mdoc_meta(mdoc));
@@ -624,11 +614,25 @@ index_merge(const struct of *of, struct mparse *mp,
pformatted(hash, buf, dbuf, of);
/*
- * Copy from the in-memory hashtable of pending keywords
- * into the database.
+ * Reclaim an empty index record, if available.
+ * Use its record number for all new btree nodes.
*/
+ if (reccur > 0) {
+ --reccur;
+ rec = recs[(int)reccur];
+ } else if (maxrec > 0) {
+ rec = maxrec;
+ maxrec = 0;
+ } else
+ rec++;
vbuf.rec = htobe32(rec);
+
+ /*
+ * Copy from the in-memory hashtable of pending
+ * keyword/mask pairs into the database.
+ */
+
seq = R_FIRST;
while (0 == (ch = (*hash->seq)(hash, &key, &val, seq))) {
seq = R_NEXT;