svn commit: r234186 - head/sys/kern

Sergey Kandaurov pluknet at freebsd.org
Thu Apr 12 15:06:58 UTC 2012


On 12 April 2012 18:49, John Baldwin <jhb at freebsd.org> wrote:
> 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) {

Thanks. I have had exactly this change in my local tree,
but I didn't commit it for some reasons I don't recall...

-- 
wbr,
pluknet


More information about the svn-src-all mailing list