summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2021-09-04 22:38:46 +0000
committerIngo Schwarze <schwarze@openbsd.org>2021-09-04 22:38:46 +0000
commit188b5a3cd5e44454fb8d65b99b4f16c10c218779 (patch)
tree0873206d488f01f2e2ecf73a425234e91f90162b /main.c
parent4e2a28a84bba32864fc4fc429fe4150833e02da4 (diff)
downloadmandoc-188b5a3cd5e44454fb8d65b99b4f16c10c218779.tar.gz
during prioritization for man(1), correctly extract the section name
from the file name extension of gzipped manual page files; bug found on Alpine Linux by Soeren Tempel <soeren at soeren hyphen tempel dot net>, who also tested this patch
Diffstat (limited to 'main.c')
-rw-r--r--main.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/main.c b/main.c
index f7c1ce9a..71df95fb 100644
--- a/main.c
+++ b/main.c
@@ -132,7 +132,7 @@ main(int argc, char *argv[])
struct mparse *mp; /* Opaque parser object. */
const char *conf_file; /* -C: alternate config file. */
const char *os_s; /* -I: Operating system for display. */
- const char *progname, *sec;
+ const char *progname, *sec, *ep;
char *defpaths; /* -M: override manpaths. */
char *auxpaths; /* -m: additional manpaths. */
char *oarg; /* -O: output option string. */
@@ -536,11 +536,16 @@ main(int argc, char *argv[])
sec++; /* Prefer without suffix. */
if (*sec != '/')
prio += 10; /* Wrong dir name. */
- if (search.sec != NULL &&
- (strlen(sec) <= ssz + 3 ||
- strcmp(sec + strlen(sec) - ssz,
- search.sec) != 0))
- prio += 20; /* Wrong file ext. */
+ if (search.sec != NULL) {
+ ep = strchr(sec, '\0');
+ if (ep - sec > 3 &&
+ strncmp(ep - 3, ".gz", 3) == 0)
+ ep -= 3;
+ if ((size_t)(ep - sec) < ssz + 3 ||
+ strncmp(ep - ssz, search.sec,
+ ssz) != 0) /* Wrong file */
+ prio += 20; /* extension. */
+ }
if (prio >= best_prio)
continue;
best_prio = prio;