Module Name:    src
Committed By:   dholland
Date:           Tue Sep 15 15:01:38 UTC 2015

Modified Files:
        src/sbin/fsck_lfs: dir.c pass2.c
        src/sbin/newfs_lfs: make_lfs.c
        src/sys/ufs/lfs: lfs_accessors.h

Log Message:
Add a function lfs_copydirname() to copy directory names in place; use
it in place of (variously) memcpy and strlcpy. (The latter isn't even
correct; was probably changed blindly from strncpy at some point.)

The new function zeroes the padding in the directory entry instead of
leaving trash behind.


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/sbin/fsck_lfs/dir.c
cvs rdiff -u -r1.29 -r1.30 src/sbin/fsck_lfs/pass2.c
cvs rdiff -u -r1.51 -r1.52 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.24 -r1.25 src/sys/ufs/lfs/lfs_accessors.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/fsck_lfs/dir.c
diff -u src/sbin/fsck_lfs/dir.c:1.40 src/sbin/fsck_lfs/dir.c:1.41
--- src/sbin/fsck_lfs/dir.c:1.40	Tue Sep 15 15:01:22 2015
+++ src/sbin/fsck_lfs/dir.c	Tue Sep 15 15:01:38 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.40 2015/09/15 15:01:22 dholland Exp $	 */
+/* $NetBSD: dir.c,v 1.41 2015/09/15 15:01:38 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -198,6 +198,7 @@ fsck_readdir(struct uvnode *vp, struct i
 		lfs_dir_setnamlen(fs, dp, 0);
 		lfs_dir_setreclen(fs, dp, LFS_DIRBLKSIZ);
 		/* for now at least, don't zero the old contents */
+		/*lfs_copydirname(fs, dp->d_name, "", 0, LFS_DIRBLKSIZ);*/
 		dp->d_name[0] = '\0';
 		if (fix)
 			VOP_BWRITE(bp);
@@ -399,7 +400,9 @@ mkentry(struct inodesc *idesc)
 	lfs_dir_setreclen(fs, dirp, newreclen);
 	lfs_dir_settype(fs, dirp, typemap[idesc->id_parent]);
 	lfs_dir_setnamlen(fs, dirp, namlen);
-	memcpy(dirp->d_name, idesc->id_name, (size_t)namlen + 1);
+	lfs_copydirname(fs, dirp->d_name, idesc->id_name,
+			namlen, newreclen);
+
 	return (ALTERED | STOP);
 }
 

Index: src/sbin/fsck_lfs/pass2.c
diff -u src/sbin/fsck_lfs/pass2.c:1.29 src/sbin/fsck_lfs/pass2.c:1.30
--- src/sbin/fsck_lfs/pass2.c:1.29	Tue Sep 15 15:01:22 2015
+++ src/sbin/fsck_lfs/pass2.c	Tue Sep 15 15:01:38 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass2.c,v 1.29 2015/09/15 15:01:22 dholland Exp $	 */
+/* $NetBSD: pass2.c,v 1.30 2015/09/15 15:01:38 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -258,16 +258,16 @@ pass2check(struct inodesc * idesc)
 		/* convert this entry to a . entry */
 		lfs_dir_setreclen(fs, &proto, lfs_dir_getreclen(fs, dirp));
 		memcpy(dirp, &proto, sizeof(proto));
-		/* 4 is entrysize - headersize (XXX: clean up) */
-		(void) strlcpy(dirp->d_name, ".", 4);
+		lfs_copydirname(fs, dirp->d_name, ".", 1,
+				lfs_dir_getreclen(fs, dirp));
 		if (reply("FIX") == 1)
 			ret |= ALTERED;
 	} else {
 		/* split this entry and use the beginning for the . entry */
 		n = lfs_dir_getreclen(fs, dirp) - entrysize;
 		memcpy(dirp, &proto, sizeof(proto));
-		/* XXX see case above */
-		(void) strlcpy(dirp->d_name, ".", 4);
+		lfs_copydirname(fs, dirp->d_name, ".", 1,
+				lfs_dir_getreclen(fs, dirp));
 		idesc->id_entryno++;
 		lncntp[lfs_dir_getino(fs, dirp)]--;
 		dirp = LFS_NEXTDIR(fs, dirp);
@@ -324,8 +324,8 @@ chk1:
 		fileerror(inp->i_parent, idesc->id_number, "MISSING '..'");
 		lfs_dir_setreclen(fs, &proto, lfs_dir_getreclen(fs, dirp));
 		memcpy(dirp, &proto, (size_t) entrysize);
-		/* 4 is entrysize - headersize (XXX: clean up) */
-		(void) strlcpy(proto.d_name, "..", 4);
+		lfs_copydirname(fs, dirp->d_name, "..", 2,
+				lfs_dir_getreclen(fs, dirp));
 		if (reply("FIX") == 1)
 			ret |= ALTERED;
 	}

Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.51 src/sbin/newfs_lfs/make_lfs.c:1.52
--- src/sbin/newfs_lfs/make_lfs.c:1.51	Tue Sep 15 14:59:58 2015
+++ src/sbin/newfs_lfs/make_lfs.c	Tue Sep 15 15:01:38 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: make_lfs.c,v 1.51 2015/09/15 14:59:58 dholland Exp $	*/
+/*	$NetBSD: make_lfs.c,v 1.52 2015/09/15 15:01:38 dholland Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
 #if 0
 static char sccsid[] = "@(#)lfs.c	8.5 (Berkeley) 5/24/95";
 #else
-__RCSID("$NetBSD: make_lfs.c,v 1.51 2015/09/15 14:59:58 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.52 2015/09/15 15:01:38 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -361,7 +361,6 @@ make_dir(struct lfs *fs, void *bufp,
 	unsigned spaceleft;
 	unsigned namlen, reclen;
 	unsigned i;
-	char *pad;
 
 	spaceleft = LFS_DIRBLKSIZ;
 	ep = bufp;
@@ -381,13 +380,9 @@ make_dir(struct lfs *fs, void *bufp,
 		lfs_dir_setreclen(fs, ep, reclen);
 		lfs_dir_settype(fs, ep, protodir[i].dp_type);
 		lfs_dir_setnamlen(fs, ep, namlen);
-		memcpy(ep->d_name, protodir[i].dp_name, namlen);
-		pad = ep->d_name + namlen;
+		lfs_copydirname(fs, ep->d_name, protodir[i].dp_name,
+				namlen, reclen);
 		ep = LFS_NEXTDIR(fs, ep);
-
-		while (pad < (char *)ep) {
-			*pad++ = '\0';
-		}
 	}
 	assert(spaceleft == 0);
 }

Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.24 src/sys/ufs/lfs/lfs_accessors.h:1.25
--- src/sys/ufs/lfs/lfs_accessors.h:1.24	Tue Sep 15 14:59:58 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Tue Sep 15 15:01:38 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.24 2015/09/15 14:59:58 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.25 2015/09/15 15:01:38 dholland Exp $	*/
 
 /*  from NetBSD: lfs.h,v 1.165 2015/07/24 06:59:32 dholland Exp  */
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
@@ -307,6 +307,17 @@ lfs_dir_setnamlen(const STRUCT_LFS *fs, 
 	dp->d_header.dh_namlen = namlen;
 }
 
+static __unused inline void
+lfs_copydirname(STRUCT_LFS *fs, char *dest, const char *src,
+		unsigned namlen, unsigned reclen)
+{
+	/* must always be at least 1 byte as a null terminator */
+	KASSERT(reclen > namlen);
+
+	memcpy(dest, src, namlen);
+	memset(dest + namlen, '\0', reclen - namlen);
+}
+
 /*
  * These are called "dirt" because they ought to be cleaned up.
  */

Reply via email to