From a2e5c5f4915c8b70f89e45f41c880642a88cfbdb Mon Sep 17 00:00:00 2001 From: schwarze Date: Tue, 18 Nov 2014 19:40:38 +0000 Subject: Ignore invalid directories in man.conf(5) and MANPATH, even if their parent directories exist, but complain about invalid directories given on the command line. Intended to fix an oddity reported by sthen@. --- usr.bin/mandoc/manpath.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) (limited to 'usr.bin/mandoc/manpath.c') diff --git a/usr.bin/mandoc/manpath.c b/usr.bin/mandoc/manpath.c index 76b1f3d8abb..515ed67b820 100644 --- a/usr.bin/mandoc/manpath.c +++ b/usr.bin/mandoc/manpath.c @@ -1,6 +1,6 @@ -/* $Id: manpath.c,v 1.10 2014/04/23 21:06:33 schwarze Exp $ */ +/* $OpenBSD: manpath.c,v 1.11 2014/11/18 19:40:38 schwarze Exp $ */ /* - * Copyright (c) 2011 Ingo Schwarze + * Copyright (c) 2011, 2014 Ingo Schwarze * Copyright (c) 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -15,6 +15,8 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include +#include #include #include @@ -29,8 +31,8 @@ #define MAN_CONF_FILE "/etc/man.conf" #define MAN_CONF_KEY "_whatdb" -static void manpath_add(struct manpaths *, const char *); -static void manpath_parseline(struct manpaths *, char *); +static void manpath_add(struct manpaths *, const char *, int); +static void manpath_parseline(struct manpaths *, char *, int); void manpath_parse(struct manpaths *dirs, const char *file, @@ -39,11 +41,11 @@ manpath_parse(struct manpaths *dirs, const char *file, char *insert; /* Always prepend -m. */ - manpath_parseline(dirs, auxp); + manpath_parseline(dirs, auxp, 1); /* If -M is given, it overrides everything else. */ if (NULL != defp) { - manpath_parseline(dirs, defp); + manpath_parseline(dirs, defp, 1); return; } @@ -61,13 +63,13 @@ manpath_parse(struct manpaths *dirs, const char *file, /* Prepend man.conf(5) to MANPATH. */ if (':' == defp[0]) { manpath_manconf(dirs, file); - manpath_parseline(dirs, defp); + manpath_parseline(dirs, defp, 0); return; } /* Append man.conf(5) to MANPATH. */ if (':' == defp[strlen(defp) - 1]) { - manpath_parseline(dirs, defp); + manpath_parseline(dirs, defp, 0); manpath_manconf(dirs, file); return; } @@ -76,21 +78,21 @@ manpath_parse(struct manpaths *dirs, const char *file, insert = strstr(defp, "::"); if (NULL != insert) { *insert++ = '\0'; - manpath_parseline(dirs, defp); + manpath_parseline(dirs, defp, 0); manpath_manconf(dirs, file); - manpath_parseline(dirs, insert + 1); + manpath_parseline(dirs, insert + 1, 0); return; } /* MANPATH overrides man.conf(5) completely. */ - manpath_parseline(dirs, defp); + manpath_parseline(dirs, defp, 0); } /* * Parse a FULL pathname from a colon-separated list of arrays. */ static void -manpath_parseline(struct manpaths *dirs, char *path) +manpath_parseline(struct manpaths *dirs, char *path, int complain) { char *dir; @@ -98,7 +100,7 @@ manpath_parseline(struct manpaths *dirs, char *path) return; for (dir = strtok(path, ":"); dir; dir = strtok(NULL, ":")) - manpath_add(dirs, dir); + manpath_add(dirs, dir, complain); } /* @@ -106,19 +108,33 @@ manpath_parseline(struct manpaths *dirs, char *path) * Grow the array one-by-one for simplicity's sake. */ static void -manpath_add(struct manpaths *dirs, const char *dir) +manpath_add(struct manpaths *dirs, const char *dir, int complain) { char buf[PATH_MAX]; + struct stat sb; char *cp; size_t i; - if (NULL == (cp = realpath(dir, buf))) + if (NULL == (cp = realpath(dir, buf))) { + if (complain) { + fputs("manpath: ", stderr); + perror(dir); + } return; + } for (i = 0; i < dirs->sz; i++) if (0 == strcmp(dirs->paths[i], dir)) return; + if (stat(cp, &sb) == -1) { + if (complain) { + fputs("manpath: ", stderr); + perror(dir); + } + return; + } + dirs->paths = mandoc_reallocarray(dirs->paths, dirs->sz + 1, sizeof(char *)); @@ -165,7 +181,7 @@ manpath_manconf(struct manpaths *dirs, const char *file) if (NULL == (q = strrchr(p, '/'))) continue; *q = '\0'; - manpath_add(dirs, p); + manpath_add(dirs, p, 0); } fclose(stream); -- cgit v1.2.3-59-g8ed1b