diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2021-09-04 22:38:46 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2021-09-04 22:38:46 +0000 |
commit | 6ba7946e9d4fb82d7b78df5df45c566b55210188 (patch) | |
tree | eaa0c4d390963cd8b102a113e61dbcdf8672af41 | |
parent | 89296a7030e3184bce7334c323327de7453570ce (diff) | |
download | mandoc-6ba7946e9d4fb82d7b78df5df45c566b55210188.tar.gz mandoc-6ba7946e9d4fb82d7b78df5df45c566b55210188.tar.zst mandoc-6ba7946e9d4fb82d7b78df5df45c566b55210188.zip |
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
-rw-r--r-- | main.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.357 2021/09/04 12:52:57 schwarze Exp $ */ +/* $Id: main.c,v 1.358 2021/09/04 22:38:46 schwarze Exp $ */ /* * Copyright (c) 2010-2012, 2014-2021 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> @@ -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; |