Module Name:    src
Committed By:   hannken
Date:           Thu Nov 10 10:54:14 UTC 2022

Modified Files:
        src/sys/fs/tmpfs: tmpfs_vfsops.c

Log Message:
Tmpfs_mount() uses tmpfs_unmount() for cleanup if set_statvfs_info() fails.
This will not work as tmpfs_unmount() needs a suspended file system.

Just call set_statvfs_info() before allocating the root vnode and add
and use a common error exit label.

Reported-by: syzbot+343f2bfea65a32ab4...@syzkaller.appspotmail.com


To generate a diff of this commit:
cvs rdiff -u -r1.77 -r1.78 src/sys/fs/tmpfs/tmpfs_vfsops.c

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

Modified files:

Index: src/sys/fs/tmpfs/tmpfs_vfsops.c
diff -u src/sys/fs/tmpfs/tmpfs_vfsops.c:1.77 src/sys/fs/tmpfs/tmpfs_vfsops.c:1.78
--- src/sys/fs/tmpfs/tmpfs_vfsops.c:1.77	Sat Apr  4 20:49:30 2020
+++ src/sys/fs/tmpfs/tmpfs_vfsops.c	Thu Nov 10 10:54:14 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: tmpfs_vfsops.c,v 1.77 2020/04/04 20:49:30 ad Exp $	*/
+/*	$NetBSD: tmpfs_vfsops.c,v 1.78 2022/11/10 10:54:14 hannken Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_vfsops.c,v 1.77 2020/04/04 20:49:30 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_vfsops.c,v 1.78 2022/11/10 10:54:14 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -196,6 +196,11 @@ tmpfs_mount(struct mount *mp, const char
 	tmpfs_mntmem_init(tmp, memlimit);
 	mp->mnt_data = tmp;
 
+	error = set_statvfs_info(path, UIO_USERSPACE, "tmpfs", UIO_SYSSPACE,
+	    mp->mnt_op->vfs_name, mp, curlwp);
+	if (error)
+		goto errout;
+
 	/* Allocate the root node. */
 	vattr_null(&va);
 	va.va_type = VDIR;
@@ -203,13 +208,8 @@ tmpfs_mount(struct mount *mp, const char
 	va.va_uid = args->ta_root_uid;
 	va.va_gid = args->ta_root_gid;
 	error = vcache_new(mp, NULL, &va, NOCRED, NULL, &vp);
-	if (error) {
-		mp->mnt_data = NULL;
-		tmpfs_mntmem_destroy(tmp);
-		mutex_destroy(&tmp->tm_lock);
-		kmem_free(tmp, sizeof(*tmp));
-		return error;
-	}
+	if (error)
+		goto errout;
 	KASSERT(vp != NULL);
 	root = VP_TO_TMPFS_NODE(vp);
 	KASSERT(root != NULL);
@@ -224,11 +224,14 @@ tmpfs_mount(struct mount *mp, const char
 	tmp->tm_root = root;
 	vrele(vp);
 
-	error = set_statvfs_info(path, UIO_USERSPACE, "tmpfs", UIO_SYSSPACE,
-	    mp->mnt_op->vfs_name, mp, curlwp);
-	if (error) {
-		(void)tmpfs_unmount(mp, MNT_FORCE);
-	}
+	return 0;
+
+errout:
+	mp->mnt_data = NULL;
+	tmpfs_mntmem_destroy(tmp);
+	mutex_destroy(&tmp->tm_lock);
+	kmem_free(tmp, sizeof(*tmp));
+
 	return error;
 }
 

Reply via email to