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:
parent
ef50d5fbc3
commit
f555b39e6b
@ -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 )) ;;
|
||||
|
Loading…
Reference in New Issue
Block a user