summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-12-10 22:01:06 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-12-10 22:01:06 +0000
commit5650c3dd4d062099f5b381d067e631126f7d6abd (patch)
tree7a5e841477b18141635064fffe1cad38c58d067a
parent0d785509b734a9aa337d97c5e1c617f9cd5fbbcf (diff)
downloadmandoc-5650c3dd4d062099f5b381d067e631126f7d6abd.tar.gz
Avoid leaking index records:
Before allocating a record for a file, first make sure we actually want to use the file.
-rw-r--r--mandocdb.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/mandocdb.c b/mandocdb.c
index 400d1626..1ad98626 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -528,29 +528,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))
@@ -625,8 +611,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));
@@ -636,11 +626,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;