Module Name: src
Committed By: jnemeth
Date: Tue May 26 08:34:23 UTC 2009
Modified Files:
src/sys/kern: kern_module.c subr_kobj.c
src/sys/sys: kobj.h
Log Message:
Move all namei flags handling into kobj_load_file().
When I originally wrote this, I was going for maximum flexibility.
However, after a private discussion with dholland@, I see how this
will cause problems with the future world order of namei whenever
that might be. At the moment, I don't need the extra flexibility,
but if something comes up this may have to be revisited.
To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/kern/kern_module.c
cvs rdiff -u -r1.37 -r1.38 src/sys/kern/subr_kobj.c
cvs rdiff -u -r1.10 -r1.11 src/sys/sys/kobj.h
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/kern_module.c
diff -u src/sys/kern/kern_module.c:1.44 src/sys/kern/kern_module.c:1.45
--- src/sys/kern/kern_module.c:1.44 Mon May 25 22:33:00 2009
+++ src/sys/kern/kern_module.c Tue May 26 08:34:23 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_module.c,v 1.44 2009/05/25 22:33:00 jnemeth Exp $ */
+/* $NetBSD: kern_module.c,v 1.45 2009/05/26 08:34:23 jnemeth Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.44 2009/05/25 22:33:00 jnemeth Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.45 2009/05/26 08:34:23 jnemeth Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -563,6 +563,7 @@
const char *s, *p;
int error;
size_t len;
+ bool nochroot;
KASSERT(mutex_owned(&module_lock));
@@ -620,14 +621,15 @@
}
path = PNBUF_GET();
if (!autoload) {
+ nochroot = false;
snprintf(path, MAXPATHLEN, "%s", name);
- error = kobj_load_file(&mod->mod_kobj, path, FOLLOW);
+ error = kobj_load_file(&mod->mod_kobj, path, nochroot);
}
if (autoload || (error == ENOENT)) {
+ nochroot = true;
snprintf(path, MAXPATHLEN, "%s/%s/%s.kmod",
module_base, name, name);
- error = kobj_load_file(&mod->mod_kobj, path,
- FOLLOW | NOCHROOT);
+ error = kobj_load_file(&mod->mod_kobj, path, nochroot);
}
if (error != 0) {
kmem_free(mod, sizeof(*mod));
Index: src/sys/kern/subr_kobj.c
diff -u src/sys/kern/subr_kobj.c:1.37 src/sys/kern/subr_kobj.c:1.38
--- src/sys/kern/subr_kobj.c:1.37 Mon May 25 22:33:00 2009
+++ src/sys/kern/subr_kobj.c Tue May 26 08:34:23 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_kobj.c,v 1.37 2009/05/25 22:33:00 jnemeth Exp $ */
+/* $NetBSD: subr_kobj.c,v 1.38 2009/05/26 08:34:23 jnemeth Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.37 2009/05/25 22:33:00 jnemeth Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.38 2009/05/26 08:34:23 jnemeth Exp $");
#include "opt_modular.h"
@@ -103,7 +103,7 @@
* Load an object located in the file system.
*/
int
-kobj_load_file(kobj_t *kop, const char *path, const uint32_t flags)
+kobj_load_file(kobj_t *kop, const char *path, const bool nochroot)
{
struct nameidata nd;
kauth_cred_t cred;
@@ -117,7 +117,8 @@
return ENOMEM;
}
- NDINIT(&nd, LOOKUP, flags, UIO_SYSSPACE, path);
+ NDINIT(&nd, LOOKUP, FOLLOW | (nochroot ? NOCHROOT : 0),
+ UIO_SYSSPACE, path);
error = vn_open(&nd, FREAD, 0);
if (error != 0) {
@@ -1105,7 +1106,7 @@
#else /* MODULAR */
int
-kobj_load_file(kobj_t *kop, const char *name, const uint32_t flags)
+kobj_load_file(kobj_t *kop, const char *name, const bool nochroot)
{
return ENOSYS;
Index: src/sys/sys/kobj.h
diff -u src/sys/sys/kobj.h:1.10 src/sys/sys/kobj.h:1.11
--- src/sys/sys/kobj.h:1.10 Mon May 25 22:33:00 2009
+++ src/sys/sys/kobj.h Tue May 26 08:34:22 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kobj.h,v 1.10 2009/05/25 22:33:00 jnemeth Exp $ */
+/* $NetBSD: kobj.h,v 1.11 2009/05/26 08:34:22 jnemeth Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
typedef struct kobj *kobj_t;
/* External interface. */
-int kobj_load_file(kobj_t *, const char *, const uint32_t);
+int kobj_load_file(kobj_t *, const char *, const bool);
int kobj_load_mem(kobj_t *, void *, ssize_t);
int kobj_affix(kobj_t, const char *);
void kobj_unload(kobj_t);