From 6434b1e6d2335e250ed60a317a585cd8821b8909 Mon Sep 17 00:00:00 2001 From: schwarze Date: Mon, 12 Oct 2015 00:32:37 +0000 Subject: [PATCH] Clear dform and dsec when exiting a first-level directory in treescan(). Fixes a segfault reported by bentley@. While here, do some style cleanup in the same function. --- usr.bin/mandoc/mandocdb.c | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/usr.bin/mandoc/mandocdb.c b/usr.bin/mandoc/mandocdb.c index 7f8c67b18d3..809ad999bce 100644 --- a/usr.bin/mandoc/mandocdb.c +++ b/usr.bin/mandoc/mandocdb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mandocdb.c,v 1.152 2015/10/12 00:07:27 schwarze Exp $ */ +/* $OpenBSD: mandocdb.c,v 1.153 2015/10/12 00:32:37 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011-2015 Ingo Schwarze @@ -574,7 +574,7 @@ treescan(void) f = fts_open((char * const *)argv, FTS_PHYSICAL | FTS_NOCHDIR, NULL); - if (NULL == f) { + if (f == NULL) { exitcode = (int)MANDOCLEVEL_SYSERR; say("", "&fts_open"); return 0; @@ -583,7 +583,7 @@ treescan(void) dsec = arch = NULL; dform = FORM_NONE; - while (NULL != (ff = fts_read(f))) { + while ((ff = fts_read(f)) != NULL) { path = ff->fts_path + 2; switch (ff->fts_info) { @@ -592,7 +592,7 @@ treescan(void) * then get handled just like regular files. */ case FTS_SL: - if (NULL == realpath(path, buf)) { + if (realpath(path, buf) == NULL) { if (warnings) say(path, "&realpath"); continue; @@ -603,7 +603,7 @@ treescan(void) continue; } /* Use logical inode to avoid mpages dupe. */ - if (-1 == stat(path, ff->fts_statp)) { + if (stat(path, ff->fts_statp) == -1) { if (warnings) say(path, "&stat"); continue; @@ -615,7 +615,7 @@ treescan(void) * stored directory data and handling the filename. */ case FTS_F: - if (0 == strcmp(path, MANDOC_DB)) + if ( ! strcmp(path, MANDOC_DB)) continue; if ( ! use_all && ff->fts_level < 2) { if (warnings) @@ -624,37 +624,37 @@ treescan(void) } gzip = 0; fsec = NULL; - while (NULL == fsec) { + while (fsec == NULL) { fsec = strrchr(ff->fts_name, '.'); - if (NULL == fsec || strcmp(fsec+1, "gz")) + if (fsec == NULL || strcmp(fsec+1, "gz")) break; gzip = 1; *fsec = '\0'; fsec = NULL; } - if (NULL == fsec) { + if (fsec == NULL) { if ( ! use_all) { if (warnings) say(path, "No filename suffix"); continue; } - } else if (0 == strcmp(++fsec, "html")) { + } else if ( ! strcmp(++fsec, "html")) { if (warnings) say(path, "Skip html"); continue; - } else if (0 == strcmp(fsec, "ps")) { + } else if ( ! strcmp(fsec, "ps")) { if (warnings) say(path, "Skip ps"); continue; - } else if (0 == strcmp(fsec, "pdf")) { + } else if ( ! strcmp(fsec, "pdf")) { if (warnings) say(path, "Skip pdf"); continue; } else if ( ! use_all && - ((FORM_SRC == dform && + ((dform == FORM_SRC && strncmp(fsec, dsec, strlen(dsec))) || - (FORM_CAT == dform && strcmp(fsec, "0")))) { + (dform == FORM_CAT && strcmp(fsec, "0")))) { if (warnings) say(path, "Wrong filename suffix"); continue; @@ -699,13 +699,16 @@ treescan(void) * If we're not in use_all, enforce it. */ cp = ff->fts_name; - if (FTS_DP == ff->fts_info) + if (ff->fts_info == FTS_DP) { + dform = FORM_NONE; + dsec = NULL; break; + } - if (0 == strncmp(cp, "man", 3)) { + if ( ! strncmp(cp, "man", 3)) { dform = FORM_SRC; dsec = cp + 3; - } else if (0 == strncmp(cp, "cat", 3)) { + } else if ( ! strncmp(cp, "cat", 3)) { dform = FORM_CAT; dsec = cp + 3; } else { @@ -713,7 +716,7 @@ treescan(void) dsec = NULL; } - if (NULL != dsec || use_all) + if (dsec != NULL || use_all) break; if (warnings) @@ -725,13 +728,13 @@ treescan(void) * Possibly our architecture. * If we're descending, keep tabs on it. */ - if (FTS_DP != ff->fts_info && NULL != dsec) + if (ff->fts_info != FTS_DP && dsec != NULL) arch = ff->fts_name; else arch = NULL; break; default: - if (FTS_DP == ff->fts_info || use_all) + if (ff->fts_info == FTS_DP || use_all) break; if (warnings) say(path, "Extraneous directory part"); -- 2.20.1