summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Schiffer <pschiffe@redhat.com>2014-01-15 12:09:43 +0000
committerColin Watson <cjwatson@debian.org>2014-01-15 12:13:07 +0000
commit5bb7ba28ae3b1ca907f399f45a5f48a371584011 (patch)
treece853d626151f3ed9b109c69e3e73ae3e1339630
parent608a9c786cb9752086cb232232071750a9b30121 (diff)
Silence error messages for stale database entries (Fedora bug #841431)
* src/filenames.c (make_filename): Return NULL if the resulting file is not readable. Update all callers to handle NULL returns. * src/tests/man-7: New file. * src/tests/Makefile.am (ALL_TESTS): Add man-7. * NEWS: Document this.
-rw-r--r--NEWS3
-rw-r--r--src/check_mandirs.c4
-rw-r--r--src/filenames.c7
-rw-r--r--src/man.c27
-rw-r--r--src/tests/Makefile.am2
-rw-r--r--src/tests/Makefile.in9
-rwxr-xr-xsrc/tests/man-727
7 files changed, 62 insertions, 17 deletions
diff --git a/NEWS b/NEWS
index 50ecb892..13c9468a 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,9 @@ Major changes since man-db 2.6.5:
o Improve support for translation of common elements of help
messages.
+ o Don't issue error messages when the database refers to a page that
+ no longer exists.
+
man-db 2.6.5 (27 June 2013)
===========================
diff --git a/src/check_mandirs.c b/src/check_mandirs.c
index 64108577..9a0c06b4 100644
--- a/src/check_mandirs.c
+++ b/src/check_mandirs.c
@@ -192,8 +192,8 @@ void test_manfile (const char *file, const char *path)
comp extensions */
abs_filename = make_filename (path, NULL,
exists, "man");
- debug ("test_manfile(): stat %s\n", abs_filename);
- if (stat (abs_filename, &physical) == -1) {
+ if (!abs_filename ||
+ stat (abs_filename, &physical) == -1) {
if (!opt_test)
dbdelete (manpage_base, exists);
} else {
diff --git a/src/filenames.c b/src/filenames.c
index 834e095d..f0251ace 100644
--- a/src/filenames.c
+++ b/src/filenames.c
@@ -27,6 +27,7 @@
#include <string.h>
#include <stdlib.h>
+#include <unistd.h>
#include "xvasprintf.h"
@@ -61,6 +62,12 @@ char *make_filename (const char *path, const char *name,
if (in->comp && *in->comp != '-') /* Is there an extension? */
file = appendstr (file, ".", in->comp, NULL);
+ debug ("Checking physical location: %s\n", file);
+ if (access (file, R_OK) != 0) {
+ free (file);
+ return NULL;
+ }
+
return file;
}
diff --git a/src/man.c b/src/man.c
index d9a956eb..af71ca20 100644
--- a/src/man.c
+++ b/src/man.c
@@ -3113,6 +3113,8 @@ static int add_candidate (struct candidate **head, char from_db, char cat,
name = req_name;
filename = make_filename (path, name, source, cat ? "cat" : "man");
+ if (!filename)
+ return 0;
ult = ult_src (filename, path, NULL,
get_ult_flags (from_db, source->id), NULL);
free (filename);
@@ -3330,9 +3332,13 @@ static int display_filesystem (struct candidate *candp)
{
char *filename = make_filename (candp->path, NULL, candp->source,
candp->cat ? "cat" : "man");
+ char *title;
+
+ if (!filename)
+ return 0;
/* source->name is never NULL thanks to add_candidate() */
- char *title = xasprintf ("%s(%s)", candp->source->name,
- candp->source->ext);
+ title = xasprintf ("%s(%s)", candp->source->name, candp->source->ext);
+
if (candp->cat) {
int r;
@@ -3420,9 +3426,7 @@ static int display_database (struct candidate *candp)
if (in->id < STRAY_CAT) { /* There should be a src page */
file = make_filename (candp->path, name, in, "man");
- debug ("Checking physical location: %s\n", file);
-
- if (access (file, R_OK) == 0) {
+ if (file) {
const char *man_file;
char *cat_file;
@@ -3444,7 +3448,7 @@ static int display_database (struct candidate *candp)
free (lang);
lang = NULL;
} /* else {drop through to the bottom and return 0 anyway} */
- } else
+ } else
#endif /* NROFF_MISSING */
@@ -3469,9 +3473,7 @@ static int display_database (struct candidate *candp)
}
file = make_filename (candp->path, name, in, "cat");
- debug ("Checking physical location: %s\n", file);
-
- if (access (file, R_OK) != 0) {
+ if (!file) {
char *catpath;
catpath = get_catpath (candp->path,
global_manpath ? SYSTEM_CAT
@@ -3481,10 +3483,7 @@ static int display_database (struct candidate *candp)
file = make_filename (catpath, name,
in, "cat");
free (catpath);
- debug ("Checking physical location: %s\n",
- file);
-
- if (access (file, R_OK) != 0) {
+ if (!file) {
/* don't delete here,
return==0 will do that */
free (title);
@@ -3548,6 +3547,8 @@ static int maybe_update_file (const char *manpath, const char *name,
real_name = name;
file = make_filename (manpath, real_name, info, "man");
+ if (!file)
+ return 0;
if (lstat (file, &buf) != 0)
return 0;
if (buf.st_mtime == info->_st_mtime)
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
index da531d51..5c44483d 100644
--- a/src/tests/Makefile.am
+++ b/src/tests/Makefile.am
@@ -27,7 +27,7 @@ TESTS_ENVIRONMENT = PATH=..:$$PATH; export PATH; \
AM_LOG_FLAGS = $(SHELL)
ALL_TESTS = \
lexgrog-1 \
- man-1 man-2 man-3 man-4 man-5 man-6 \
+ man-1 man-2 man-3 man-4 man-5 man-6 man-7 \
manconv-1 manconv-2 manconv-3 \
mandb-1 mandb-2 mandb-3 mandb-4 mandb-5 mandb-6 \
whatis-1 \
diff --git a/src/tests/Makefile.in b/src/tests/Makefile.in
index 55c42847..13f7fdd6 100644
--- a/src/tests/Makefile.in
+++ b/src/tests/Makefile.in
@@ -1435,7 +1435,7 @@ TESTS_ENVIRONMENT = PATH=..:$$PATH; export PATH; \
AM_LOG_FLAGS = $(SHELL)
ALL_TESTS = \
lexgrog-1 \
- man-1 man-2 man-3 man-4 man-5 man-6 \
+ man-1 man-2 man-3 man-4 man-5 man-6 man-7 \
manconv-1 manconv-2 manconv-3 \
mandb-1 mandb-2 mandb-3 mandb-4 mandb-5 mandb-6 \
whatis-1 \
@@ -1680,6 +1680,13 @@ man-6.log: man-6
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+man-7.log: man-7
+ @p='man-7'; \
+ b='man-7'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
manconv-1.log: manconv-1
@p='manconv-1'; \
b='manconv-1'; \
diff --git a/src/tests/man-7 b/src/tests/man-7
new file mode 100755
index 00000000..7dd0ed04
--- /dev/null
+++ b/src/tests/man-7
@@ -0,0 +1,27 @@
+#! /bin/sh
+
+# Test for invalid DB entry.
+# https://bugzilla.redhat.com/show_bug.cgi?id=841431
+
+: ${srcdir=.}
+. "$srcdir/testlib.sh"
+
+: ${MAN=man}
+: ${MANDB=mandb}
+
+init
+fake_config /usr/share/man
+export MANPATH="$tmpdir/usr/share/man"
+
+write_page test 1 "$tmpdir/usr/share/man/man1/test.1" \
+ UTF-8 '' '' 'test \- top-level test page'
+run $MANDB -C "$tmpdir/manpath.config" -u -q "$tmpdir/usr/share/man"
+
+rm -f "$tmpdir/usr/share/man/man1/test.1"
+
+echo "No manual entry for test" > "$tmpdir/1.exp"
+LC_ALL=C run $MAN -C "$tmpdir/manpath.config" test 2> "$tmpdir/1.out"
+expect_pass 'invalid DB entry' \
+ 'diff -u "$tmpdir/1.exp" "$tmpdir/1.out"'
+
+finish