git: 0760a2e9a4d9 - stable/13 - man: reset OPTIND before parsing args
Kyle Evans
kevans at FreeBSD.org
Sun Oct 3 05:15:43 UTC 2021
The branch stable/13 has been updated by kevans:
URL: https://cgit.FreeBSD.org/src/commit/?id=0760a2e9a4d98047042349aa1bfed9d1d0f2212e
commit 0760a2e9a4d98047042349aa1bfed9d1d0f2212e
Author: Kyle Evans <kevans at FreeBSD.org>
AuthorDate: 2021-09-22 19:58:19 +0000
Commit: Kyle Evans <kevans at FreeBSD.org>
CommitDate: 2021-10-03 05:14:43 +0000
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.
(cherry picked from commit f555b39e6bb7cbfbe1905e90f64c4dfc4456fabb)
---
usr.bin/man/man.sh | 4 ++++
1 file changed, 4 insertions(+)
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 )) ;;
More information about the dev-commits-src-all
mailing list