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,