Author: jhb
Date: Thu Apr 12 14:49:25 2012
New Revision: 234186
URL: http://svn.freebsd.org/changeset/base/234186

Log:
  If a linker file contains at least one module, but all of the modules
  fail to load (the MOD_LOAD event fails) during a kldload(2), unload the
  linker file and fail the kldload(2) with ENOEXEC.
  
  Reported by:  gcooper
  MFC after:    1 week

Modified:
  head/sys/kern/kern_linker.c

Modified: head/sys/kern/kern_linker.c
==============================================================================
--- head/sys/kern/kern_linker.c Thu Apr 12 14:06:05 2012        (r234185)
+++ head/sys/kern/kern_linker.c Thu Apr 12 14:49:25 2012        (r234186)
@@ -380,7 +380,7 @@ linker_load_file(const char *filename, l
 {
        linker_class_t lc;
        linker_file_t lf;
-       int foundfile, error;
+       int foundfile, error, modules;
 
        /* Refuse to load modules if securelevel raised */
        if (prison0.pr_securelevel > 0)
@@ -419,11 +419,22 @@ linker_load_file(const char *filename, l
                                linker_file_unload(lf, LINKER_UNLOAD_FORCE);
                                return (error);
                        }
+                       modules = !TAILQ_EMPTY(&lf->modules);
                        KLD_UNLOCK();
                        linker_file_register_sysctls(lf);
                        linker_file_sysinit(lf);
                        KLD_LOCK();
                        lf->flags |= LINKER_FILE_LINKED;
+
+                       /*
+                        * If all of the modules in this file failed
+                        * to load, unload the file and return an
+                        * error of ENOEXEC.
+                        */
+                       if (modules && TAILQ_EMPTY(&lf->modules)) {
+                               linker_file_unload(lf, LINKER_UNLOAD_FORCE);
+                               return (ENOEXEC);
+                       }
                        *result = lf;
                        return (0);
                }
@@ -627,7 +638,7 @@ linker_file_unload(linker_file_t file, i
 
        /*
         * Inform any modules associated with this file that they are
-        * being be unloaded.
+        * being unloaded.
         */
        MOD_XLOCK;
        for (mod = TAILQ_FIRST(&file->modules); mod; mod = next) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to