aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2021-09-22 19:58:19 +0000
committerKyle Evans <kevans@FreeBSD.org>2021-09-23 19:13:34 +0000
commitf555b39e6bb7cbfbe1905e90f64c4dfc4456fabb (patch)
tree0819de8e13a79ad9cfad6831c9be4ae8c39dc8ac
parentef50d5fbc39fc39970eab1234222b5ac1d9ba74c (diff)
downloadsrc-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-xusr.bin/man/man.sh4
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 )) ;;