git: 5fb605771bcd - stable/15 - install: add -z <max_cmp_size> option

Dag-Erling Smørgrav <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a687792.1cf45.a847ad0__21247.837359418$1785231309$gmane$org@gitrepo.freebsd.org>
The branch stable/15 has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=5fb605771bcd1545f465bdaaac27e7488fb5bb08

commit 5fb605771bcd1545f465bdaaac27e7488fb5bb08
Author:     Aleksandr Rybalko <[email protected]>
AuthorDate: 2026-05-25 07:53:20 +0000
Commit:     Dag-Erling Smørgrav <[email protected]>
CommitDate: 2026-07-28 09:30:21 +0000

    install: add -z <max_cmp_size> option
    
    Introduces the -z <max_cmp_size> flag, enabling users to set a custom file
    size limit for pre-installation change checks and avoiding future hard-coded
    limit modifications.
    
    Reviewed by:    glebius
    Approved by:    glebius (mentor)
    Obtained from:  Fudo Security
    MFC after:      2 weeks
    Sponsored by:   Fudo Security
    Differential Revision:  https://reviews.freebsd.org/D57230
    
    (cherry picked from commit 97cad013a50a4012328e11424ed2350c1efc036c)
---
 usr.bin/xinstall/Makefile   |  2 +-
 usr.bin/xinstall/install.1  | 13 +++++++++++--
 usr.bin/xinstall/xinstall.c | 18 ++++++++++++++----
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/usr.bin/xinstall/Makefile b/usr.bin/xinstall/Makefile
index fd95b97160fe..c05a50420c82 100644
--- a/usr.bin/xinstall/Makefile
+++ b/usr.bin/xinstall/Makefile
@@ -11,7 +11,7 @@ MAN=		install.1
 CFLAGS+=	-I${SRCTOP}/contrib/mtree
 CFLAGS+=	-I${SRCTOP}/lib/libnetbsd
 
-LIBADD=		md
+LIBADD=		md util
 CFLAGS+=	-DWITH_MD5 -DWITH_RIPEMD160
 
 .ifdef BOOTSTRAPPING
diff --git a/usr.bin/xinstall/install.1 b/usr.bin/xinstall/install.1
index c6a55632891c..77b928d022db 100644
--- a/usr.bin/xinstall/install.1
+++ b/usr.bin/xinstall/install.1
@@ -33,7 +33,7 @@
 .Nd install binaries
 .Sh SYNOPSIS
 .Nm
-.Op Fl bCcpSsUv
+.Op Fl bCcpSsUvz
 .Op Fl B Ar suffix
 .Op Fl D Ar destdir
 .Op Fl f Ar flags
@@ -45,9 +45,10 @@
 .Op Fl N Ar dbdir
 .Op Fl o Ar owner
 .Op Fl T Ar tags
+.Op Fl z Ar size
 .Ar file1 file2
 .Nm
-.Op Fl bCcpSsUv
+.Op Fl bCcpSsUvz
 .Op Fl B Ar suffix
 .Op Fl D Ar destdir
 .Op Fl f Ar flags
@@ -59,6 +60,7 @@
 .Op Fl N Ar dbdir
 .Op Fl o Ar owner
 .Op Fl T Ar tags
+.Op Fl z Ar size
 .Ar file1 ... fileN directory
 .Nm
 .Fl d
@@ -271,6 +273,13 @@ Cause
 .Nm
 to be verbose,
 showing files as they are installed or backed up.
+.It Fl z Ar maxsize
+Limit the comparison feature of
+.Fl C
+to files no larger than
+.Ar maxsize .
+Files exceeding this limit bypass the comparison step and are directly overwritten.
+The default maximum size is 128MiB.
 .El
 .Pp
 By default,
diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
index 188812bbf7dd..70107581a570 100644
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -58,6 +58,7 @@
 #include <string.h>
 #include <sysexits.h>
 #include <unistd.h>
+#include <util.h>
 #include <vis.h>
 
 #include "mtree.h"
@@ -138,6 +139,7 @@ static FILE *metafp;
 static const char *group, *owner;
 static const char *suffix = BACKUP_SUFFIX;
 static char *destdir, *digest, *fflags, *metafile, *tags;
+static size_t max_compare_size = MAX_CMP_SIZE;
 
 static int	compare(int, const char *, size_t, int, const char *, size_t,
 		    char **);
@@ -169,12 +171,13 @@ main(int argc, char *argv[])
 	u_int iflags;
 	char *p;
 	const char *to_name;
+	uint64_t num;
 
 	fset = 0;
 	iflags = 0;
 	set = NULL;
 	group = owner = NULL;
-	while ((ch = getopt(argc, argv, "B:bCcD:df:g:h:l:M:m:N:o:pSsT:Uv")) !=
+	while ((ch = getopt(argc, argv, "B:bCcD:df:g:h:l:M:m:N:o:pSsT:Uvz:")) !=
 	     -1)
 		switch((char)ch) {
 		case 'B':
@@ -271,6 +274,13 @@ main(int argc, char *argv[])
 		case 'v':
 			verbose = 1;
 			break;
+		case 'z':
+			if (expand_number(optarg, &num) != 0 || num == 0) {
+				errx(EX_USAGE, "invalid max compare filesize:"
+				    " %s", optarg);
+			}
+			max_compare_size = num;
+			break;
 		case '?':
 		default:
 			usage();
@@ -1099,7 +1109,7 @@ compare(int from_fd, const char *from_name __unused, size_t from_len,
 
 	do_digest = (digesttype != DIGEST_NONE && dresp != NULL &&
 	    *dresp == NULL);
-	if (from_len <= MAX_CMP_SIZE) {
+	if (from_len <= max_compare_size) {
 		static char *buf, *buf1, *buf2;
 		static size_t bufsize;
 		int n1, n2;
@@ -1491,11 +1501,11 @@ usage(void)
 {
 	(void)fprintf(stderr,
 "usage: install [-bCcpSsUv] [-f flags] [-g group] [-m mode] [-o owner]\n"
-"               [-M log] [-D dest] [-h hash] [-T tags]\n"
+"               [-M log] [-D dest] [-h hash] [-T tags] [-z maxcmpsize]\n"
 "               [-B suffix] [-l linkflags] [-N dbdir]\n"
 "               file1 file2\n"
 "       install [-bCcpSsUv] [-f flags] [-g group] [-m mode] [-o owner]\n"
-"               [-M log] [-D dest] [-h hash] [-T tags]\n"
+"               [-M log] [-D dest] [-h hash] [-T tags] [-z maxcmpsize]\n"
 "               [-B suffix] [-l linkflags] [-N dbdir]\n"
 "               file1 ... fileN directory\n"
 "       install -dU [-vU] [-g group] [-m mode] [-N dbdir] [-o owner]\n"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.