summaryrefslogtreecommitdiffstats
path: root/usr.bin/mandoc/manpath.c
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2014-11-18 19:40:38 +0000
committerschwarze <schwarze@openbsd.org>2014-11-18 19:40:38 +0000
commita2e5c5f4915c8b70f89e45f41c880642a88cfbdb (patch)
treeaf3339bd26520b61206026476d6977f9671f4569 /usr.bin/mandoc/manpath.c
parentDelete tmp directory in /mnt/var during upgrades right before the (diff)
downloadwireguard-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.c48
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);