diff options
author | Kyle Evans <kevans@FreeBSD.org> | 2021-09-22 19:58:19 +0000 |
---|---|---|
committer | Kyle Evans <kevans@FreeBSD.org> | 2021-09-23 19:13:34 +0000 |
commit | f555b39e6bb7cbfbe1905e90f64c4dfc4456fabb (patch) | |
tree | 0819de8e13a79ad9cfad6831c9be4ae8c39dc8ac | |
parent | ef50d5fbc39fc39970eab1234222b5ac1d9ba74c (diff) | |
download | src-f555b39e6bb7cbfbe1905e90f64c4dfc4456fabb.tar.gz src-f555b39e6bb7cbfbe1905e90f64c4dfc4456fabb.zip |
man: reset OPTIND before parsing args
From jilles: POSIX requires that a script set `OPTIND=1` before using
different sets of parameters with `getopts`, or the results will be
unspecified.
The specific problem observed here is that we would execute `man -f` or
`man -k` without cleaning up state from man_parse_args()' `getopts`
loop. FreeBSD's /bin/sh seems to reset OPTIND to 1 after we hit the
second getopts loop, rendering the following shift harmless; other
/bin/sh implementations will leave it at what we came into the loop at
(e.g., bash as /bin/sh), shifting off any keywords that we had.
Input from: jilles
Reviewed by: allanjude, bapt, imp
Sponsored by: Klara, Inc.
Differential Revision: https://reviews.freebsd.org/D32063
-rwxr-xr-x | usr.bin/man/man.sh | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/usr.bin/man/man.sh b/usr.bin/man/man.sh index f31c464fcc8f..084f4a06829b 100755 --- a/usr.bin/man/man.sh +++ b/usr.bin/man/man.sh @@ -243,6 +243,7 @@ is_newer() { manpath_parse_args() { local cmd_arg + OPTIND=1 while getopts 'Ldq' cmd_arg; do case "${cmd_arg}" in L) Lflag=Lflag ;; @@ -426,6 +427,7 @@ man_display_page_groff() { if [ -n "$MANROFFSEQ" ]; then set -- -$MANROFFSEQ + OPTIND=1 while getopts 'egprtv' preproc_arg; do case "${preproc_arg}" in e) pipeline="$pipeline | $EQN" ;; @@ -545,6 +547,7 @@ man_find_and_display() { man_parse_args() { local IFS cmd_arg + OPTIND=1 while getopts 'M:P:S:adfhkm:op:tw' cmd_arg; do case "${cmd_arg}" in M) MANPATH=$OPTARG ;; @@ -933,6 +936,7 @@ trim() { # Parse commandline args for whatis and apropos. whatis_parse_args() { local cmd_arg + OPTIND=1 while getopts 'd' cmd_arg; do case "${cmd_arg}" in d) debug=$(( $debug + 1 )) ;; |