Module Name: src Committed By: christos Date: Thu Dec 5 17:17:43 UTC 2024
Modified Files: src/usr.sbin/mtree: compare.c crc.c create.c extern.h misc.c spec.c verify.c Log Message: PR/58875: Jose Luis Duran: Produce consistent checksums in verification by scanning directories in the same order as usual. While here, fix some incorrect types. To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/usr.sbin/mtree/compare.c cvs rdiff -u -r1.10 -r1.11 src/usr.sbin/mtree/crc.c cvs rdiff -u -r1.78 -r1.79 src/usr.sbin/mtree/create.c cvs rdiff -u -r1.40 -r1.41 src/usr.sbin/mtree/extern.h cvs rdiff -u -r1.34 -r1.35 src/usr.sbin/mtree/misc.c cvs rdiff -u -r1.91 -r1.92 src/usr.sbin/mtree/spec.c cvs rdiff -u -r1.48 -r1.49 src/usr.sbin/mtree/verify.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/mtree/compare.c diff -u src/usr.sbin/mtree/compare.c:1.60 src/usr.sbin/mtree/compare.c:1.61 --- src/usr.sbin/mtree/compare.c:1.60 Sat Apr 3 09:37:18 2021 +++ src/usr.sbin/mtree/compare.c Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: compare.c,v 1.60 2021/04/03 13:37:18 simonb Exp $ */ +/* $NetBSD: compare.c,v 1.61 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1989, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)compare.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: compare.c,v 1.60 2021/04/03 13:37:18 simonb Exp $"); +__RCSID("$NetBSD: compare.c,v 1.61 2024/12/05 17:17:43 christos Exp $"); #endif #endif /* not lint */ @@ -233,7 +233,7 @@ typeerr: LABEL; "%suser expected %lu found %lu" : "%suser (%lu, %lu", tab, (u_long)s->st_uid, (u_long)p->fts_statp->st_uid); if (uflag) { - if (lchown(p->fts_accpath, s->st_uid, -1)) + if (lchown(p->fts_accpath, s->st_uid, (gid_t)-1)) printf(", not modified: %s%s\n", strerror(errno), flavor == F_FREEBSD9 ? "" : ")"); @@ -252,7 +252,7 @@ typeerr: LABEL; "%sgid expected %lu found %lu" : "%sgid (%lu, %lu", tab, (u_long)s->st_gid, (u_long)p->fts_statp->st_gid); if (uflag) { - if (lchown(p->fts_accpath, -1, s->st_gid)) + if (lchown(p->fts_accpath, (uid_t)-1, s->st_gid)) printf(", not modified: %s%s\n", strerror(errno), flavor == F_FREEBSD9 ? "" : ")"); @@ -576,7 +576,7 @@ const char * rlink(const char *name) { static char lbuf[MAXPATHLEN]; - int len; + ssize_t len; if ((len = readlink(name, lbuf, sizeof(lbuf) - 1)) == -1) mtree_err("%s: %s", name, strerror(errno)); Index: src/usr.sbin/mtree/crc.c diff -u src/usr.sbin/mtree/crc.c:1.10 src/usr.sbin/mtree/crc.c:1.11 --- src/usr.sbin/mtree/crc.c:1.10 Thu Mar 18 16:02:18 2021 +++ src/usr.sbin/mtree/crc.c Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: crc.c,v 1.10 2021/03/18 20:02:18 cheusov Exp $ */ +/* $NetBSD: crc.c,v 1.11 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -41,7 +41,7 @@ #if 0 static char sccsid[] = "@(#)crc.c 8.1 (Berkeley) 6/17/93"; #else -__RCSID("$NetBSD: crc.c,v 1.10 2021/03/18 20:02:18 cheusov Exp $"); +__RCSID("$NetBSD: crc.c,v 1.11 2024/12/05 17:17:43 christos Exp $"); #endif #endif /* not lint */ @@ -114,13 +114,13 @@ static const uint32_t crctab[] = { * locations to store the crc and the number of bytes read. It returns 0 on * success and 1 on failure. Errno is set on failure. */ -uint32_t crc_total = ~0; /* The crc over a number of files. */ +uint32_t crc_total = ~0u; /* The crc over a number of files. */ int crc(int fd, uint32_t *cval, uint32_t *clen) { u_char *p; - int nr; + ssize_t nr; uint32_t thecrc, len; uint32_t crctot; u_char buf[16 * 1024]; @@ -132,12 +132,12 @@ crc(int fd, uint32_t *cval, uint32_t *cl crctot = ~crc_total; while ((nr = read(fd, buf, sizeof(buf))) > 0) if (sflag) { - for (len += nr, p = buf; nr--; ++p) { + for (len += (uint32_t)nr, p = buf; nr--; ++p) { COMPUTE(thecrc, *p); COMPUTE(crctot, *p); } } else { - for (len += nr, p = buf; nr--; ++p) + for (len += (uint32_t)nr, p = buf; nr--; ++p) COMPUTE(thecrc, *p); } if (nr < 0) Index: src/usr.sbin/mtree/create.c diff -u src/usr.sbin/mtree/create.c:1.78 src/usr.sbin/mtree/create.c:1.79 --- src/usr.sbin/mtree/create.c:1.78 Tue Apr 23 21:44:51 2024 +++ src/usr.sbin/mtree/create.c Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: create.c,v 1.78 2024/04/24 01:44:51 christos Exp $ */ +/* $NetBSD: create.c,v 1.79 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1989, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)create.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: create.c,v 1.78 2024/04/24 01:44:51 christos Exp $"); +__RCSID("$NetBSD: create.c,v 1.79 2024/12/05 17:17:43 christos Exp $"); #endif #endif /* not lint */ @@ -84,13 +84,6 @@ static uid_t uid; static mode_t mode; static u_long flags; -#if defined(__FreeBSD__) && !defined(HAVE_NBTOOL_CONFIG_H) -#define FTS_CONST const -#else -#define FTS_CONST -#endif - -static int dcmp(const FTSENT *FTS_CONST *, const FTSENT *FTS_CONST *); static void output(FILE *, int, int *, const char *, ...) __printflike(4, 5); static int statd(FILE *, FTS *, FTSENT *, uid_t *, gid_t *, mode_t *, @@ -444,27 +437,6 @@ statd(FILE *fp, FTS *t, FTSENT *parent, return (0); } -/* - * dcmp -- - * used as a comparison function passed to fts_open() to control - * the order in which fts_read() returns results. We make - * directories sort after non-directories, but otherwise sort in - * strcmp() order. - * - * Keep this in sync with nodecmp() in spec.c. - */ -static int -dcmp(const FTSENT *FTS_CONST *a, const FTSENT *FTS_CONST *b) -{ - - if (S_ISDIR((*a)->fts_statp->st_mode)) { - if (!S_ISDIR((*b)->fts_statp->st_mode)) - return (1); - } else if (S_ISDIR((*b)->fts_statp->st_mode)) - return (-1); - return (strcmp((*a)->fts_name, (*b)->fts_name)); -} - void output(FILE *fp, int indent, int *offset, const char *fmt, ...) { Index: src/usr.sbin/mtree/extern.h diff -u src/usr.sbin/mtree/extern.h:1.40 src/usr.sbin/mtree/extern.h:1.41 --- src/usr.sbin/mtree/extern.h:1.40 Thu Mar 18 16:02:18 2021 +++ src/usr.sbin/mtree/extern.h Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.40 2021/03/18 20:02:18 cheusov Exp $ */ +/* $NetBSD: extern.h,v 1.41 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -49,6 +49,12 @@ #include <netdb.h> #endif +#if defined(__FreeBSD__) && !defined(HAVE_NBTOOL_CONFIG_H) +#define FTS_CONST const +#else +#define FTS_CONST +#endif + #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif @@ -64,6 +70,7 @@ int check_excludes(const char *, const int compare(NODE *, FTSENT *); int crc(int, uint32_t *, uint32_t *); void cwalk(FILE *); +int dcmp(const FTSENT *FTS_CONST *, const FTSENT *FTS_CONST *); void dump_nodes(FILE *, const char *, NODE *, int); void init_excludes(void); int matchtags(NODE *); Index: src/usr.sbin/mtree/misc.c diff -u src/usr.sbin/mtree/misc.c:1.34 src/usr.sbin/mtree/misc.c:1.35 --- src/usr.sbin/mtree/misc.c:1.34 Thu Dec 20 14:09:25 2012 +++ src/usr.sbin/mtree/misc.c Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: misc.c,v 1.34 2012/12/20 19:09:25 christos Exp $ */ +/* $NetBSD: misc.c,v 1.35 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: misc.c,v 1.34 2012/12/20 19:09:25 christos Exp $"); +__RCSID("$NetBSD: misc.c,v 1.35 2024/12/05 17:17:43 christos Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -111,7 +111,7 @@ slist_t excludetags, includetags; int keys = KEYDEFAULT; -int keycompare(const void *, const void *); +static int keycompare(const void *, const void *); u_int parsekey(const char *name, int *needvaluep) @@ -153,7 +153,7 @@ parsetype(const char *name) return (k->val); } -int +static int keycompare(const void *a, const void *b) { @@ -198,7 +198,7 @@ void parsetags(slist_t *list, char *args) { char *p, *e; - int len; + size_t len; if (args == NULL) { addtag(list, NULL); Index: src/usr.sbin/mtree/spec.c diff -u src/usr.sbin/mtree/spec.c:1.91 src/usr.sbin/mtree/spec.c:1.92 --- src/usr.sbin/mtree/spec.c:1.91 Mon Nov 4 10:39:17 2024 +++ src/usr.sbin/mtree/spec.c Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: spec.c,v 1.91 2024/11/04 15:39:17 christos Exp $ */ +/* $NetBSD: spec.c,v 1.92 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1989, 1993 @@ -67,7 +67,7 @@ #if 0 static char sccsid[] = "@(#)spec.c 8.2 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: spec.c,v 1.91 2024/11/04 15:39:17 christos Exp $"); +__RCSID("$NetBSD: spec.c,v 1.92 2024/12/05 17:17:43 christos Exp $"); #endif #endif /* not lint */ @@ -543,7 +543,8 @@ replacenode(NODE *cur, NODE *new) static void set(char *t, NODE *ip) { - int type, value, len; + int type, value; + size_t len; gid_t gid; uid_t uid; char *kw, *val, *md, *ep; @@ -842,7 +843,7 @@ addchild(NODE *pathparent, NODE *centry) * directories sort after non-directories, but otherwise sort in * strcmp() order. * - * Keep this in sync with dcmp() in create.c. + * Keep this in sync with dcmp() below. */ static int nodecmp(const NODE *a, const NODE *b) @@ -851,7 +852,30 @@ nodecmp(const NODE *a, const NODE *b) if ((a->type & F_DIR) != 0) { if ((b->type & F_DIR) == 0) return 1; - } else if ((b->type & F_DIR) != 0) + } else if ((b->type & F_DIR) != 0) { return -1; + } return strcmp(a->name, b->name); } + +/* + * dcmp -- + * used as a comparison function passed to fts_open() to control + * the order in which fts_read() returns results. We make + * directories sort after non-directories, but otherwise sort in + * strcmp() order. + * + * Keep this in sync with nodecmp() above. + */ +int +dcmp(const FTSENT *FTS_CONST *a, const FTSENT *FTS_CONST *b) +{ + + if (S_ISDIR((*a)->fts_statp->st_mode)) { + if (!S_ISDIR((*b)->fts_statp->st_mode)) + return 1; + } else if (S_ISDIR((*b)->fts_statp->st_mode)) { + return -1; + } + return strcmp((*a)->fts_name, (*b)->fts_name); +} Index: src/usr.sbin/mtree/verify.c diff -u src/usr.sbin/mtree/verify.c:1.48 src/usr.sbin/mtree/verify.c:1.49 --- src/usr.sbin/mtree/verify.c:1.48 Sat Dec 2 08:34:48 2023 +++ src/usr.sbin/mtree/verify.c Thu Dec 5 12:17:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: verify.c,v 1.48 2023/12/02 13:34:48 christos Exp $ */ +/* $NetBSD: verify.c,v 1.49 2024/12/05 17:17:43 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)verify.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: verify.c,v 1.48 2023/12/02 13:34:48 christos Exp $"); +__RCSID("$NetBSD: verify.c,v 1.49 2024/12/05 17:17:43 christos Exp $"); #endif #endif /* not lint */ @@ -86,7 +86,7 @@ vwalk(void) argv[0] = dot; argv[1] = NULL; - if ((t = fts_open(argv, ftsoptions, NULL)) == NULL) + if ((t = fts_open(argv, ftsoptions, dcmp)) == NULL) mtree_err("fts_open: %s", strerror(errno)); level = root; specdepth = rval = 0; @@ -180,7 +180,7 @@ miss(NODE *p, char *tail) int create; char *tp; const char *type; - uint32_t flags; + u_long flags; for (; p; p = p->next) { if (p->flags & F_OPT && !(p->flags & F_VISIT))