Module Name: src Committed By: perseant Date: Wed Aug 14 15:37:49 UTC 2024
Modified Files: src/sbin/fsck_exfatfs [perseant-exfatfs]: pass1.c src/sys/fs/exfatfs [perseant-exfatfs]: exfatfs_extern.c exfatfs_extern.h exfatfs_rename.c exfatfs_vfsops.c exfatfs_vnops.c src/usr.sbin/dumpexfatfs [perseant-exfatfs]: exfatfs.c Log Message: Require filenames to contain at least one character after conversion. Avoid duplicate deactivation of an rwlock in exfatfs_rename by adding an argument to exfatfs_freexfinode. To generate a diff of this commit: cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sbin/fsck_exfatfs/pass1.c cvs rdiff -u -r1.1.2.8 -r1.1.2.9 src/sys/fs/exfatfs/exfatfs_extern.c cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sys/fs/exfatfs/exfatfs_extern.h cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/fs/exfatfs/exfatfs_rename.c cvs rdiff -u -r1.1.2.7 -r1.1.2.8 src/sys/fs/exfatfs/exfatfs_vfsops.c cvs rdiff -u -r1.1.2.9 -r1.1.2.10 src/sys/fs/exfatfs/exfatfs_vnops.c cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/usr.sbin/dumpexfatfs/exfatfs.c 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_exfatfs/pass1.c diff -u src/sbin/fsck_exfatfs/pass1.c:1.1.2.4 src/sbin/fsck_exfatfs/pass1.c:1.1.2.5 --- src/sbin/fsck_exfatfs/pass1.c:1.1.2.4 Fri Aug 2 00:19:00 2024 +++ src/sbin/fsck_exfatfs/pass1.c Wed Aug 14 15:37:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: pass1.c,v 1.1.2.4 2024/08/02 00:19:00 perseant Exp $ */ +/* $NetBSD: pass1.c,v 1.1.2.5 2024/08/14 15:37:49 perseant Exp $ */ /*- * Copyright (c) 2022 The NetBSD Foundation, Inc. @@ -208,7 +208,7 @@ validfunc(void *arg, struct xfinode *xip if (VTOXI(vp) != xip) { /* Already in cache */ fprintf(stderr, "** freeing serial %lu in favor of %lu\n", xip->xi_serial, VTOXI(vp)->xi_serial); - exfatfs_freexfinode(xip); + exfatfs_freexfinode(xip, 0); xip = VTOXI(vp); dserial = xip->xi_serial; assert(dserial > 0); Index: src/sys/fs/exfatfs/exfatfs_extern.c diff -u src/sys/fs/exfatfs/exfatfs_extern.c:1.1.2.8 src/sys/fs/exfatfs/exfatfs_extern.c:1.1.2.9 --- src/sys/fs/exfatfs/exfatfs_extern.c:1.1.2.8 Mon Aug 12 22:43:36 2024 +++ src/sys/fs/exfatfs/exfatfs_extern.c Wed Aug 14 15:37:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: exfatfs_extern.c,v 1.1.2.8 2024/08/12 22:43:36 perseant Exp $ */ +/* $NetBSD: exfatfs_extern.c,v 1.1.2.9 2024/08/14 15:37:49 perseant Exp $ */ /*- * Copyright (c) 2022 The NetBSD Foundation, Inc. @@ -725,7 +725,7 @@ exfatfs_newxfinode(struct exfatfs *fs, u return xip; } -void exfatfs_freexfinode(struct xfinode *xip) +void exfatfs_freexfinode(struct xfinode *xip, int destroy_lock) { int i; @@ -743,7 +743,8 @@ void exfatfs_freexfinode(struct xfinode //printf("free xfniode serial %lu from %p\n", xip->xi_serial, xip); xip->xi_serial = -1; #ifdef _KERNEL - rw_destroy(&xip->xi_rwlock); + if (destroy_lock) + rw_destroy(&xip->xi_rwlock); memset(xip, 0xFF, sizeof(*xip)); pool_put(&exfatfs_xfinode_pool, xip); #else /* ! _KERNEL */ @@ -1055,7 +1056,7 @@ exfatfs_scandir(struct vnode *dvp, out: if (xip != NULL) - exfatfs_freexfinode(xip); + exfatfs_freexfinode(xip, 1); assert(dxip->xi_serial == dserial); if (bp != NULL) brelse(bp, 0); Index: src/sys/fs/exfatfs/exfatfs_extern.h diff -u src/sys/fs/exfatfs/exfatfs_extern.h:1.1.2.4 src/sys/fs/exfatfs/exfatfs_extern.h:1.1.2.5 --- src/sys/fs/exfatfs/exfatfs_extern.h:1.1.2.4 Fri Aug 2 00:16:55 2024 +++ src/sys/fs/exfatfs/exfatfs_extern.h Wed Aug 14 15:37:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: exfatfs_extern.h,v 1.1.2.4 2024/08/02 00:16:55 perseant Exp $ */ +/* $NetBSD: exfatfs_extern.h,v 1.1.2.5 2024/08/14 15:37:49 perseant Exp $ */ /*- * Copyright (c) 2022 The NetBSD Foundation, Inc. @@ -44,7 +44,7 @@ struct xfinode *exfatfs_newxfinode(struc struct exfatfs_dirent *exfatfs_newdirent(void); int exfatfs_get_file_name(struct xfinode *, uint16_t *, int *, int); int exfatfs_set_file_name(struct xfinode *, uint16_t *, int); -void exfatfs_freexfinode(struct xfinode *); +void exfatfs_freexfinode(struct xfinode *, int); void exfatfs_freedirent(struct exfatfs_dirent *); int exfatfs_scandir(struct vnode *, off_t, off_t *, unsigned (*)(void *, off_t, off_t), Index: src/sys/fs/exfatfs/exfatfs_rename.c diff -u src/sys/fs/exfatfs/exfatfs_rename.c:1.1.2.2 src/sys/fs/exfatfs/exfatfs_rename.c:1.1.2.3 --- src/sys/fs/exfatfs/exfatfs_rename.c:1.1.2.2 Mon Jul 1 22:15:21 2024 +++ src/sys/fs/exfatfs/exfatfs_rename.c Wed Aug 14 15:37:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: exfatfs_rename.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $ */ +/* $NetBSD: exfatfs_rename.c,v 1.1.2.3 2024/08/14 15:37:49 perseant Exp $ */ /*- * Copyright (c) 2011, 2022 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: exfatfs_rename.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $"); +__KERNEL_RCSID(0, "$NetBSD: exfatfs_rename.c,v 1.1.2.3 2024/08/14 15:37:49 perseant Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -470,7 +470,7 @@ exfatfs_gro_rename(struct mount *mp, kau /* Re-key to match its new on-disk location */ exfatfs_rekey(fvp, &new_key); } - exfatfs_freexfinode(ofxip); + exfatfs_freexfinode(ofxip, 0); if (tvp != NULL) *tvp_nlinkp = 0; @@ -499,7 +499,7 @@ reactivateoldname: restoretvp: if (ofxip != NULL) - exfatfs_freexfinode(ofxip); + exfatfs_freexfinode(ofxip, 0); if (tvp != NULL) { exfatfs_activate(txip, true); Index: src/sys/fs/exfatfs/exfatfs_vfsops.c diff -u src/sys/fs/exfatfs/exfatfs_vfsops.c:1.1.2.7 src/sys/fs/exfatfs/exfatfs_vfsops.c:1.1.2.8 --- src/sys/fs/exfatfs/exfatfs_vfsops.c:1.1.2.7 Mon Aug 12 22:28:04 2024 +++ src/sys/fs/exfatfs/exfatfs_vfsops.c Wed Aug 14 15:37:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: exfatfs_vfsops.c,v 1.1.2.7 2024/08/12 22:28:04 perseant Exp $ */ +/* $NetBSD: exfatfs_vfsops.c,v 1.1.2.8 2024/08/14 15:37:49 perseant Exp $ */ /*- * Copyright (c) 2022 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: exfatfs_vfsops.c,v 1.1.2.7 2024/08/12 22:28:04 perseant Exp $"); +__KERNEL_RCSID(0, "$NetBSD: exfatfs_vfsops.c,v 1.1.2.8 2024/08/14 15:37:49 perseant Exp $"); struct vm_page; @@ -746,7 +746,7 @@ exfatfs_root(struct mount *mp, int lktyp mutex_exit(&fs->xf_lock); if (error) - exfatfs_freexfinode(xip); + exfatfs_freexfinode(xip, 1); return error; } Index: src/sys/fs/exfatfs/exfatfs_vnops.c diff -u src/sys/fs/exfatfs/exfatfs_vnops.c:1.1.2.9 src/sys/fs/exfatfs/exfatfs_vnops.c:1.1.2.10 --- src/sys/fs/exfatfs/exfatfs_vnops.c:1.1.2.9 Fri Aug 2 00:16:55 2024 +++ src/sys/fs/exfatfs/exfatfs_vnops.c Wed Aug 14 15:37:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: exfatfs_vnops.c,v 1.1.2.9 2024/08/02 00:16:55 perseant Exp $ */ +/* $NetBSD: exfatfs_vnops.c,v 1.1.2.10 2024/08/14 15:37:49 perseant Exp $ */ /*- * Copyright (c) 2022 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: exfatfs_vnops.c,v 1.1.2.9 2024/08/02 00:16:55 perseant Exp $"); +__KERNEL_RCSID(0, "$NetBSD: exfatfs_vnops.c,v 1.1.2.10 2024/08/14 15:37:49 perseant Exp $"); #include <sys/buf.h> #include <sys/dirent.h> @@ -1018,6 +1018,10 @@ exfatfs_alloc(struct vnode *dvp, struct if (exfatfs_check_filename_ucs2(fs, ucs2filename, ucs2len) != 0) return EINVAL; + /* Require at least one character after conversion */ + if (ucs2len <= 0) + return EINVAL; + /* Create a new inode */ xip = exfatfs_newxfinode(fs, 0, 0); @@ -1143,7 +1147,7 @@ exfatfs_alloc(struct vnode *dvp, struct return (0); errout: - exfatfs_freexfinode(xip); + exfatfs_freexfinode(xip, 1); return error; } @@ -1485,14 +1489,14 @@ exfatfs_lookup(void *v) &fx.xip->xi_key, sizeof(fx.xip->xi_key), &nvp); if (error) { - exfatfs_freexfinode(fx.xip); + exfatfs_freexfinode(fx.xip, 1); return error; } KASSERT(VTOXI(nvp) != NULL); if (VTOXI(nvp) != fx.xip) { /* In vnode cache, though not in name cache */ LIST_REMOVE(fx.xip, xi_newxip); - exfatfs_freexfinode(fx.xip); + exfatfs_freexfinode(fx.xip, 1); } GETPARENT(VTOXI(nvp), dvp); *vpp = nvp; @@ -2052,7 +2056,7 @@ exfatfs_reclaim(void *v) mutex_enter(vp->v_interlock); vp->v_data = NULL; mutex_exit(vp->v_interlock); - exfatfs_freexfinode(xip); + exfatfs_freexfinode(xip, 1); return (0); } Index: src/usr.sbin/dumpexfatfs/exfatfs.c diff -u src/usr.sbin/dumpexfatfs/exfatfs.c:1.1.2.2 src/usr.sbin/dumpexfatfs/exfatfs.c:1.1.2.3 --- src/usr.sbin/dumpexfatfs/exfatfs.c:1.1.2.2 Tue Jul 2 20:36:51 2024 +++ src/usr.sbin/dumpexfatfs/exfatfs.c Wed Aug 14 15:37:49 2024 @@ -146,7 +146,7 @@ exfatfs_vop_bmap(struct uvnode * vp, dad int exfatfs_freevnode(struct uvnode *vp) { - exfatfs_freexfinode(VTOXI(vp)); + exfatfs_freexfinode(VTOXI(vp), 0); return 1; /* Already free */ }