aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2019-05-03 17:31:15 +0000
committerIngo Schwarze <schwarze@openbsd.org>2019-05-03 17:31:15 +0000
commitfeaca3814c803930a197fc98e4de5900cc8516f6 (patch)
treee273fba075c85084d7820bb80bd54fe46e693a3e
parent4032441100971dc191efba89224073639c5a9b42 (diff)
downloadmandoc-feaca3814c803930a197fc98e4de5900cc8516f6.tar.gz
mandoc-feaca3814c803930a197fc98e4de5900cc8516f6.tar.zst
mandoc-feaca3814c803930a197fc98e4de5900cc8516f6.zip
In fs_lookup(), use stat(2) rather than access(2) to check file existence.
Some mildly broken real-world packages on some operating systems contain dangling symlinks in manual page directories: pestering the user to run makewhatis(8) makes no sense because that won't help. On the other hand, missing read permissions deserve ugly error messages and are unlikely to occur in practice anyway. Fixing an issue reported by Lorenzo Beretta <loreb at github> as part of https://github.com/void-linux/void-packages/issues/9868 .
-rw-r--r--TODO8
-rw-r--r--main.c19
2 files changed, 13 insertions, 14 deletions
diff --git a/TODO b/TODO
index 33eccde7..dd97163c 100644
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
************************************************************************
* Official mandoc TODO.
-* $Id: TODO,v 1.293 2019/05/03 16:14:41 schwarze Exp $
+* $Id: TODO,v 1.294 2019/05/03 17:31:15 schwarze Exp $
************************************************************************
Many issues are annotated for difficulty as follows:
@@ -217,12 +217,6 @@ are mere guesses, and some may be wrong.
--- missing misc features ----------------------------------------------
-- dead .so links should be entered into the database to avoid:
- man -M. lvm-config
- man: outdated mandoc.db lacks lvm-config(8) entry, run makewhatis /co/void-man
- https://github.com/void-linux/void-packages/issues/9868
- loc * exist ** algo * size * imp **
-
- man -ks 1,8 route; kn@ Jul 13, 2018 orally
- italic correction (\/) in PostScript mode
diff --git a/main.c b/main.c
index fbb7bf28..bfe918b8 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.325 2019/05/03 16:14:42 schwarze Exp $ */
+/* $Id: main.c,v 1.326 2019/05/03 17:31:15 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2012, 2014-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/param.h> /* MACHINE */
+#include <sys/stat.h>
#include <sys/wait.h>
#include <assert.h>
@@ -713,6 +714,7 @@ fs_lookup(const struct manpaths *paths, size_t ipath,
const char *sec, const char *arch, const char *name,
struct manpage **res, size_t *ressz)
{
+ struct stat sb;
glob_t globinfo;
struct manpage *page;
char *file;
@@ -722,13 +724,13 @@ fs_lookup(const struct manpaths *paths, size_t ipath,
form = FORM_SRC;
mandoc_asprintf(&file, "%s/man%s/%s.%s",
paths->paths[ipath], sec, name, sec);
- if (access(file, R_OK) != -1)
+ if (stat(file, &sb) != -1)
goto found;
free(file);
mandoc_asprintf(&file, "%s/cat%s/%s.0",
paths->paths[ipath], sec, name);
- if (access(file, R_OK) != -1) {
+ if (stat(file, &sb) != -1) {
form = FORM_CAT;
goto found;
}
@@ -737,7 +739,7 @@ fs_lookup(const struct manpaths *paths, size_t ipath,
if (arch != NULL) {
mandoc_asprintf(&file, "%s/man%s/%s/%s.%s",
paths->paths[ipath], sec, arch, name, sec);
- if (access(file, R_OK) != -1)
+ if (stat(file, &sb) != -1)
goto found;
free(file);
}
@@ -751,13 +753,16 @@ fs_lookup(const struct manpaths *paths, size_t ipath,
if (globres == 0)
file = mandoc_strdup(*globinfo.gl_pathv);
globfree(&globinfo);
- if (globres == 0)
- goto found;
+ if (globres == 0) {
+ if (stat(file, &sb) != -1)
+ goto found;
+ free(file);
+ }
if (res != NULL || ipath + 1 != paths->sz)
return 0;
mandoc_asprintf(&file, "%s.%s", name, sec);
- globres = access(file, R_OK);
+ globres = stat(file, &sb);
free(file);
return globres != -1;