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