git: b7834095749d - stable/13 - pax: Clear arcn in each read function.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 01 Aug 2024 16:46:53 UTC
The branch stable/13 has been updated by des:

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

commit b7834095749d56d7d35871918ed371f133fcb624
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2024-07-24 20:06:44 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2024-08-01 16:42:34 +0000

    pax: Clear arcn in each read function.
    
    Instead of initializing individual fields to zero, clear the entire
    struct prior to populating it.
    
    MFC after:      1 week
    Sponsored by:   Klara, Inc.
    Reviewed by:    0mp, markj
    Differential Revision:  https://reviews.freebsd.org/D46097
    
    (cherry picked from commit f890020d43bf2070f12ffec37bcd9579f6fb1347)
---
 bin/pax/cpio.c | 12 +++---------
 bin/pax/tar.c  | 20 ++------------------
 2 files changed, 5 insertions(+), 27 deletions(-)

diff --git a/bin/pax/cpio.c b/bin/pax/cpio.c
index 76edca3c6f91..0b5b95bb5ef5 100644
--- a/bin/pax/cpio.c
+++ b/bin/pax/cpio.c
@@ -280,13 +280,13 @@ cpio_rd(ARCHD *arcn, char *buf)
 	 */
 	if (cpio_id(buf, sizeof(HD_CPIO)) < 0)
 		return(-1);
+	memset(arcn, 0, sizeof *arcn);
 	hd = (HD_CPIO *)buf;
 
 	/*
 	 * byte oriented cpio (posix) does not have padding! extract the octal
 	 * ascii fields from the header
 	 */
-	arcn->pad = 0L;
 	arcn->sb.st_dev = (dev_t)asc_ul(hd->c_dev, sizeof(hd->c_dev), OCT);
 	arcn->sb.st_ino = (ino_t)asc_ul(hd->c_ino, sizeof(hd->c_ino), OCT);
 	arcn->sb.st_mode = (mode_t)asc_ul(hd->c_mode, sizeof(hd->c_mode), OCT);
@@ -315,8 +315,6 @@ cpio_rd(ARCHD *arcn, char *buf)
 		/*
 	 	 * no link name to read for this file
 	 	 */
-		arcn->ln_nlen = 0;
-		arcn->ln_name[0] = '\0';
 		return(com_rd(arcn));
 	}
 
@@ -561,8 +559,8 @@ vcpio_rd(ARCHD *arcn, char *buf)
 			return(-1);
 	}
 
+	memset(arcn, 0, sizeof *arcn);
 	hd = (HD_VCPIO *)buf;
-	arcn->pad = 0L;
 
 	/*
 	 * extract the hex ascii fields from the header
@@ -609,8 +607,6 @@ vcpio_rd(ARCHD *arcn, char *buf)
 		/*
 		 * we have a valid header (not a link)
 		 */
-		arcn->ln_nlen = 0;
-		arcn->ln_name[0] = '\0';
 		arcn->pad = VCPIO_PAD(arcn->sb.st_size);
 		return(com_rd(arcn));
 	}
@@ -857,7 +853,7 @@ bcpio_rd(ARCHD *arcn, char *buf)
 	if (bcpio_id(buf, sizeof(HD_BCPIO)) < 0)
 		return(-1);
 
-	arcn->pad = 0L;
+	memset(arcn, 0, sizeof *arcn);
 	hd = (HD_BCPIO *)buf;
 	if (swp_head) {
 		/*
@@ -919,8 +915,6 @@ bcpio_rd(ARCHD *arcn, char *buf)
 		/*
 		 * we have a valid header (not a link)
 		 */
-		arcn->ln_nlen = 0;
-		arcn->ln_name[0] = '\0';
 		arcn->pad = BCPIO_PAD(arcn->sb.st_size);
 		return(com_rd(arcn));
 	}
diff --git a/bin/pax/tar.c b/bin/pax/tar.c
index cbe2dbab64f8..785dd32c4838 100644
--- a/bin/pax/tar.c
+++ b/bin/pax/tar.c
@@ -373,9 +373,9 @@ tar_rd(ARCHD *arcn, char *buf)
 	 */
 	if (tar_id(buf, BLKMULT) < 0)
 		return(-1);
+	memset(arcn, 0, sizeof *arcn);
 	arcn->org_name = arcn->name;
 	arcn->sb.st_nlink = 1;
-	arcn->pat = NULL;
 
 	/*
 	 * copy out the name and values in the stat buffer
@@ -402,8 +402,6 @@ tar_rd(ARCHD *arcn, char *buf)
 	 * to encode this as a directory
 	 */
 	pt = &(arcn->name[arcn->nlen - 1]);
-	arcn->pad = 0;
-	arcn->skip = 0;
 	switch(hd->linkflag) {
 	case SYMTYPE:
 		/*
@@ -440,8 +438,6 @@ tar_rd(ARCHD *arcn, char *buf)
 		arcn->type = PAX_DIR;
 		arcn->sb.st_mode |= S_IFDIR;
 		arcn->sb.st_nlink = 2;
-		arcn->ln_name[0] = '\0';
-		arcn->ln_nlen = 0;
 		break;
 	case AREGTYPE:
 	case REGTYPE:
@@ -449,8 +445,6 @@ tar_rd(ARCHD *arcn, char *buf)
 		/*
 		 * If we have a trailing / this is a directory and NOT a file.
 		 */
-		arcn->ln_name[0] = '\0';
-		arcn->ln_nlen = 0;
 		if (*pt == '/') {
 			/*
 			 * it is a directory, set the mode for -v printing
@@ -727,10 +721,9 @@ ustar_rd(ARCHD *arcn, char *buf)
 	 */
 	if (ustar_id(buf, BLKMULT) < 0)
 		return(-1);
+	memset(arcn, 0, sizeof *arcn);
 	arcn->org_name = arcn->name;
 	arcn->sb.st_nlink = 1;
-	arcn->pat = NULL;
-	arcn->nlen = 0;
 	hd = (HD_USTAR *)buf;
 
 	/*
@@ -777,15 +770,6 @@ ustar_rd(ARCHD *arcn, char *buf)
 	if (uid_name(hd->uname, &(arcn->sb.st_uid)) < 0)
 		arcn->sb.st_uid = (uid_t)asc_ul(hd->uid, sizeof(hd->uid), OCT);
 
-	/*
-	 * set the defaults, these may be changed depending on the file type
-	 */
-	arcn->ln_name[0] = '\0';
-	arcn->ln_nlen = 0;
-	arcn->pad = 0;
-	arcn->skip = 0;
-	arcn->sb.st_rdev = (dev_t)0;
-
 	/*
 	 * set the mode and PAX type according to the typeflag in the header
 	 */