The code for loading a module plist from a file system is messed up in
that it calls namei() and then it calls vn_open() on the same
nameidata without reinitializing it or cleaning up the previous
results. I'm surprised this didn't result in fireworks, but apparently
it didn't.

The following patch fixes that, and compiles, but I'm not set up to be
able to test this -- is there anyone who can do so easily/quickly?

Index: kern_module_vfs.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_module_vfs.c,v
retrieving revision 1.3
diff -u -p -r1.3 kern_module_vfs.c
--- kern_module_vfs.c   16 Feb 2010 05:47:52 -0000      1.3
+++ kern_module_vfs.c   8 Mar 2010 02:33:36 -0000
@@ -147,23 +147,18 @@ module_load_plist_vfs(const char *modpat
        NDINIT(&nd, LOOKUP, FOLLOW | (nochroot ? NOCHROOT : 0),
            UIO_SYSSPACE, proppath);
 
-       error = namei(&nd);
-       if (error != 0) {
-               goto out1;
+       error = vn_open(&nd, FREAD, 0);
+       if (error != 0) {
+               goto out1;
        }
 
        error = vn_stat(nd.ni_vp, &sb);
        if (error != 0) {
-               goto out1;
+               goto out;
        }
        if (sb.st_size >= (plistsize - 1)) {    /* leave space for term \0 */
                error = EFBIG;
-               goto out1;
-       }
-
-       error = vn_open(&nd, FREAD, 0);
-       if (error != 0) {
-               goto out1;
+               goto out;
        }
 
        base = kmem_alloc(plistsize, KM_SLEEP);



-- 
David A. Holland
dholl...@netbsd.org

Reply via email to