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

Reply via email to