]> git.cameronkatri.com Git - mandoc.git/commitdiff
In fs_lookup(), use stat(2) rather than access(2) to check file existence.
authorIngo Schwarze <schwarze@openbsd.org>
Fri, 3 May 2019 17:31:15 +0000 (17:31 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Fri, 3 May 2019 17:31:15 +0000 (17:31 +0000)
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 .

TODO
main.c

diff --git a/TODO b/TODO
index 33eccde776af4c7a3966cc4f43643c2e72bff036..dd97163c857013978fb12fb6ccb5de963d0e1f62 100644 (file)
--- 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 fbb7bf28ec226cddfe18c309b6d0757f9c0b5199..bfe918b869d269f7a174f3480712cc02376e9ab5 100644 (file)
--- 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;