Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Apr 2012 19:10:10 +0400
From:      Sergey Kandaurov <pluknet@freebsd.org>
To:        John Baldwin <jhb@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r234186 - head/sys/kern
Message-ID:  <CAE-mSOJ8_odgJoEO=GjhDB2rDX0T58O925P9KR_azhmfDwvUbg@mail.gmail.com>
In-Reply-To: <CAE-mSOJUD4%2BiGXDhDPi%2Bvt4JjbPUa5A0sPN5CtqiCnA3kbv9Hg@mail.gmail.com>
References:  <201204121449.q3CEnP8L033082@svn.freebsd.org> <CAE-mSOJUD4%2BiGXDhDPi%2Bvt4JjbPUa5A0sPN5CtqiCnA3kbv9Hg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 12 April 2012 19:06, Sergey Kandaurov <pluknet@freebsd.org> wrote:
> On 12 April 2012 18:49, John Baldwin <jhb@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:
>> =A0If a linker file contains at least one module, but all of the modules
>> =A0fail to load (the MOD_LOAD event fails) during a kldload(2), unload t=
he
>> =A0linker file and fail the kldload(2) with ENOEXEC.
>>
>> =A0Reported by: =A0gcooper
>> =A0MFC after: =A0 =A01 week
>>
>> Modified:
>> =A0head/sys/kern/kern_linker.c
>>
>> Modified: head/sys/kern/kern_linker.c
>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
>> --- head/sys/kern/kern_linker.c Thu Apr 12 14:06:05 2012 =A0 =A0 =A0 =A0=
(r234185)
>> +++ head/sys/kern/kern_linker.c Thu Apr 12 14:49:25 2012 =A0 =A0 =A0 =A0=
(r234186)
>> @@ -380,7 +380,7 @@ linker_load_file(const char *filename, l
>> =A0{
>> =A0 =A0 =A0 =A0linker_class_t lc;
>> =A0 =A0 =A0 =A0linker_file_t lf;
>> - =A0 =A0 =A0 int foundfile, error;
>> + =A0 =A0 =A0 int foundfile, error, modules;
>>
>> =A0 =A0 =A0 =A0/* Refuse to load modules if securelevel raised */
>> =A0 =A0 =A0 =A0if (prison0.pr_securelevel > 0)
>> @@ -419,11 +419,22 @@ linker_load_file(const char *filename, l
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0linker_fi=
le_unload(lf, LINKER_UNLOAD_FORCE);
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (e=
rror);
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 modules =3D !TAILQ_EMPTY(&=
lf->modules);
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0KLD_UNLOCK();
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0linker_file_register_sysc=
tls(lf);
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0linker_file_sysinit(lf);
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0KLD_LOCK();
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0lf->flags |=3D LINKER_FIL=
E_LINKED;
>> +
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* If all of the modules=
 in this file failed
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* to load, unload the f=
ile and return an
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* error of ENOEXEC.
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (modules && TAILQ_EMPTY=
(&lf->modules)) {
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 linker_fil=
e_unload(lf, LINKER_UNLOAD_FORCE);
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EN=
OEXEC);
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*result =3D lf;
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (0);
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
>> @@ -627,7 +638,7 @@ linker_file_unload(linker_file_t file, i
>>
>> =A0 =A0 =A0 =A0/*
>> =A0 =A0 =A0 =A0 * Inform any modules associated with this file that they=
 are
>> - =A0 =A0 =A0 =A0* being be unloaded.
>> + =A0 =A0 =A0 =A0* being unloaded.
>> =A0 =A0 =A0 =A0 */
>> =A0 =A0 =A0 =A0MOD_XLOCK;
>> =A0 =A0 =A0 =A0for (mod =3D TAILQ_FIRST(&file->modules); mod; mod =3D ne=
xt) {
>
> 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.

--=20
wbr,
pluknet



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAE-mSOJ8_odgJoEO=GjhDB2rDX0T58O925P9KR_azhmfDwvUbg>