Module Name:    src
Committed By:   christos
Date:           Mon Jul  1 00:58:05 UTC 2024

Modified Files:
        src/sys/kern: vfs_lookup.c vfs_syscalls.c
        src/sys/sys: namei.src

Log Message:
refactor slightly so we don't try to read the buffer supplied by userland.


To generate a diff of this commit:
cvs rdiff -u -r1.234 -r1.235 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.563 -r1.564 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.64 -r1.65 src/sys/sys/namei.src

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

Modified files:

Index: src/sys/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.234 src/sys/kern/vfs_lookup.c:1.235
--- src/sys/kern/vfs_lookup.c:1.234	Mon May  1 01:12:44 2023
+++ src/sys/kern/vfs_lookup.c	Sun Jun 30 20:58:04 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.234 2023/05/01 05:12:44 mlelstv Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.235 2024/07/01 00:58:04 christos Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.234 2023/05/01 05:12:44 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.235 2024/07/01 00:58:04 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_magiclinks.h"
@@ -2267,76 +2267,68 @@ namei_simple_convert_flags(namei_simple_
 
 int
 namei_simple_kernel(const char *path, namei_simple_flags_t sflags,
-	struct vnode **vp_ret)
+    struct vnode **vp_ret)
 {
 	return nameiat_simple_kernel(NULL, path, sflags, vp_ret);
 }
 
 int
-nameiat_simple_kernel(struct vnode *dvp, const char *path,
-	namei_simple_flags_t sflags, struct vnode **vp_ret)
+nameiat_simple(struct vnode *dvp, struct pathbuf *pb,
+    namei_simple_flags_t sflags, struct vnode **vp_ret)
 {
 	struct nameidata nd;
-	struct pathbuf *pb;
-	int err;
-
-	pb = pathbuf_create(path);
-	if (pb == NULL) {
-		return ENOMEM;
-	}
+	int error;
 
-	NDINIT(&nd,
-		LOOKUP,
-		namei_simple_convert_flags(sflags),
-		pb);
+	NDINIT(&nd, LOOKUP, namei_simple_convert_flags(sflags), pb);
 
 	if (dvp != NULL)
 		NDAT(&nd, dvp);
 
-	err = namei(&nd);
-	if (err != 0) {
-		pathbuf_destroy(pb);
-		return err;
-	}
+	error = namei(&nd);
+	if (error != 0)
+		return error;
+
 	*vp_ret = nd.ni_vp;
-	pathbuf_destroy(pb);
 	return 0;
 }
 
 int
+nameiat_simple_kernel(struct vnode *dvp, const char *path,
+    namei_simple_flags_t sflags, struct vnode **vp_ret)
+{
+	struct pathbuf *pb;
+	int error;
+
+	pb = pathbuf_create(path);
+	if (pb == NULL)
+		return ENOMEM;
+
+	error = nameiat_simple(dvp, pb, sflags, vp_ret);
+
+	pathbuf_destroy(pb);
+	return error;
+}
+
+int
 namei_simple_user(const char *path, namei_simple_flags_t sflags,
-	struct vnode **vp_ret)
+    struct vnode **vp_ret)
 {
 	return nameiat_simple_user(NULL, path, sflags, vp_ret);
 }
 
 int
 nameiat_simple_user(struct vnode *dvp, const char *path,
-	namei_simple_flags_t sflags, struct vnode **vp_ret)
+    namei_simple_flags_t sflags, struct vnode **vp_ret)
 {
 	struct pathbuf *pb;
-	struct nameidata nd;
-	int err;
-
-	err = pathbuf_copyin(path, &pb);
-	if (err) {
-		return err;
-	}
+	int error;
 
-	NDINIT(&nd,
-		LOOKUP,
-		namei_simple_convert_flags(sflags),
-		pb);
+	error = pathbuf_copyin(path, &pb);
+	if (error)
+		return error;
 
-	if (dvp != NULL)
-		NDAT(&nd, dvp);
+	error = nameiat_simple(dvp, pb, sflags, vp_ret);
 
-	err = namei(&nd);
-	if (err != 0) {
-		pathbuf_destroy(pb);
-		return err;
-	}
-	*vp_ret = nd.ni_vp;
 	pathbuf_destroy(pb);
-	return 0;
+	return error;
 }

Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.563 src/sys/kern/vfs_syscalls.c:1.564
--- src/sys/kern/vfs_syscalls.c:1.563	Sun Jun 30 20:51:11 2024
+++ src/sys/kern/vfs_syscalls.c	Sun Jun 30 20:58:04 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls.c,v 1.563 2024/07/01 00:51:11 christos Exp $	*/
+/*	$NetBSD: vfs_syscalls.c,v 1.564 2024/07/01 00:58:04 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009, 2019, 2020, 2023 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.563 2024/07/01 00:51:11 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.564 2024/07/01 00:58:04 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_fileassoc.h"
@@ -259,8 +259,16 @@ fd_nameiat_simple_user(struct lwp *l, in
 	file_t *dfp;
 	struct vnode *dvp;
 	int error;
+	struct pathbuf *pb;
+	const char *p;
 
-	if (fdat != AT_FDCWD) {
+	error = pathbuf_copyin(path, &pb);
+	if (error) {
+		return error;
+	}
+	p = pathbuf_stringcopy_get(pb);
+
+	if (fdat != AT_FDCWD && p[0] != '/') {
 		if ((error = fd_getvnode(fdat, &dfp)) != 0)
 			goto out;
 
@@ -269,11 +277,15 @@ fd_nameiat_simple_user(struct lwp *l, in
 		dvp = NULL;
 	}
 
-	error = nameiat_simple_user(dvp, path, sflags, vp_ret);
+	error = nameiat_simple(dvp, pb, sflags, vp_ret);
 
 	if (fdat != AT_FDCWD)
 		fd_putfile(fdat);
+
 out:
+	pathbuf_stringcopy_put(pb, p);
+	pathbuf_destroy(pb);
+
 	return error;
 }
 

Index: src/sys/sys/namei.src
diff -u src/sys/sys/namei.src:1.64 src/sys/sys/namei.src:1.65
--- src/sys/sys/namei.src:1.64	Sat Sep 23 14:21:12 2023
+++ src/sys/sys/namei.src	Sun Jun 30 20:58:05 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: namei.src,v 1.64 2023/09/23 18:21:12 ad Exp $	*/
+/*	$NetBSD: namei.src,v 1.65 2024/07/01 00:58:05 christos Exp $	*/
 
 /*
  * Copyright (c) 1985, 1989, 1991, 1993
@@ -272,7 +272,7 @@ extern const namei_simple_flags_t
  *
  * namei_simple_kernel takes a kernel-space path as the first argument.
  * namei_simple_user takes a user-space path as the first argument.
- * The nameiat_simple_* variants handle relative path using the given 
+ * The nameiat_simple* variants handle relative path using the given 
  * directory vnode instead of current directory.
  *
  * A namei call can be converted to namei_simple_* if:
@@ -283,6 +283,8 @@ extern const namei_simple_flags_t
  */
 int namei_simple_kernel(const char *, namei_simple_flags_t, struct vnode **);
 int namei_simple_user(const char *, namei_simple_flags_t, struct vnode **);
+int nameiat_simple(struct vnode *, struct pathbuf *, namei_simple_flags_t,
+    struct vnode **);
 int nameiat_simple_kernel(struct vnode *, const char *, namei_simple_flags_t,
     struct vnode **);
 int nameiat_simple_user(struct vnode *, const char *, namei_simple_flags_t, 

Reply via email to