svn commit: r234186 - head/sys/kern

Sergey Kandaurov pluknet at freebsd.org
Thu Apr 12 15:10:14 UTC 2012


On 12 April 2012 19:06, Sergey Kandaurov <pluknet at freebsd.org> wrote:
> 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...

Doh, I have had something different.. Sorry.

-- 
wbr,
pluknet


More information about the svn-src-head mailing list