From feaca3814c803930a197fc98e4de5900cc8516f6 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Fri, 3 May 2019 17:31:15 +0000 Subject: 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 as part of https://github.com/void-linux/void-packages/issues/9868 . --- TODO | 8 +------- main.c | 19 ++++++++++++------- 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 * Copyright (c) 2010-2012, 2014-2019 Ingo Schwarze @@ -21,6 +21,7 @@ #include #include #include /* MACHINE */ +#include #include #include @@ -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; -- cgit v1.2.3-56-ge451