git: 3ede04c78c7c - main - ldconfig(8): check for no-args command line after options are parsed

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Wed, 24 Nov 2021 23:56:24 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=3ede04c78c7c726ed79a39d22c65a58d0ecc5d00

commit 3ede04c78c7c726ed79a39d22c65a58d0ecc5d00
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-11-19 04:07:58 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-11-24 23:55:04 +0000

    ldconfig(8): check for no-args command line after options are parsed
    
    Default action for ldconfig is specified as -R AKA 'append', and for
    no-args (without options changing default actions), ldconfig should
    append empty list of directories to current list.  But because the check
    was done before options were parsed out, presence of any option turned
    off default rescan.
    
    As result, innocently-looked commands like `ldconfig -v' were interpreted
    as setting directory hints list to one specified on the command line,
    i.e. empty.
    
    Reported by:    https://github.com/mesonbuild/meson/issues/9592
    Reviewed by:    emaste
    Tested by:      jbeich
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D33058
---
 sbin/ldconfig/ldconfig.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/sbin/ldconfig/ldconfig.c b/sbin/ldconfig/ldconfig.c
index 288c22813121..b039412a648b 100644
--- a/sbin/ldconfig/ldconfig.c
+++ b/sbin/ldconfig/ldconfig.c
@@ -90,9 +90,7 @@ main(int argc, char **argv)
 		hints_file = _PATH_ELF32_HINTS;
 	else
 		hints_file = _PATH_ELF_HINTS;
-	if (argc == 1)
-		rescan = true;
-	else while((c = getopt(argc, argv, "Rf:imrsv")) != -1) {
+	while((c = getopt(argc, argv, "Rf:imrsv")) != -1) {
 		switch (c) {
 		case 'R':
 			rescan = true;
@@ -121,11 +119,14 @@ main(int argc, char **argv)
 		}
 	}
 
-	if (justread)
+	if (justread) {
 		list_elf_hints(hints_file);
-	else
+	} else {
+		if (argc == optind)
+			rescan = true;
 		update_elf_hints(hints_file, argc - optind,
 		    argv + optind, merge || rescan);
+	}
 	exit(0);
 }