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. */