diff options
author | 2014-11-18 19:40:38 +0000 | |
---|---|---|
committer | 2014-11-18 19:40:38 +0000 | |
commit | a2e5c5f4915c8b70f89e45f41c880642a88cfbdb (patch) | |
tree | af3339bd26520b61206026476d6977f9671f4569 /usr.bin/mandoc/manpath.c | |
parent | Delete tmp directory in /mnt/var during upgrades right before the (diff) | |
download | wireguard-openbsd-a2e5c5f4915c8b70f89e45f41c880642a88cfbdb.tar.xz wireguard-openbsd-a2e5c5f4915c8b70f89e45f41c880642a88cfbdb.zip |
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@.
Diffstat (limited to 'usr.bin/mandoc/manpath.c')
-rw-r--r-- | usr.bin/mandoc/manpath.c | 48 |
1 files changed, 32 insertions, 16 deletions
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 <schwarze@openbsd.org> + * Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * * 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 <sys/types.h> +#include <sys/stat.h> #include <assert.h> #include <ctype.h> @@ -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); |