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
This commit is contained in:
Kyle Evans 2021-09-22 14:58:19 -05:00
parent ef50d5fbc3
commit f555b39e6b

View File

@ -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 )) ;;