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,