Hacky v jadre [Was: Re: nechodici X Windows po rekompilaci jadra]
Stanislav Meduna
stano na trillian.eunet.sk
Neděle Březen 1 10:05:12 CET 1998
Alexandr Malusek <malusek na hroch.ujf.cas.cz> wrote:
: _X11TransSocketUNIXConnect: Can't connect: errno = 111
: It's a kernel bug. The function sys_iopl in
: arch/i386/kernel/ioport.c does an illegal hack which used to work
: but is now broken since GCC optimizes more aggressively . The
: newer 2.1.x kernels already have a fix which should also work in
: 2.0.32.
diff-ol som si to a vyzera to skutocne dost zvlastne:
2.0.33:
asmlinkage int sys_iopl(long ebx,long ecx,long edx,
long esi, long edi, long ebp, long eax, long ds,
long es, long fs, long gs, long orig_eax,
long eip,long cs,long eflags,long esp,long ss)
{
unsigned int level = ebx;
if (level > 3)
return -EINVAL;
if (!suser())
return -EPERM;
*(&eflags) = (eflags & 0xffffcfff) | (level << 12);
return 0;
}
Z toho je pomerne zjavne, co egcs plnym pravom vyoptimalizoval (a aj trik,
ktory v tom zabranoval gcc).
2.1.88:
asmlinkage int sys_iopl(unsigned long unused)
{
struct pt_regs * regs = (struct pt_regs *) &unused;
unsigned int level = regs->ebx;
if (level > 3)
return -EINVAL;
if (!suser())
return -EPERM;
regs->eflags = (regs->eflags & 0xffffcfff) | (level << 12);
return 0;
}
Cize to iste, ale zamotane tak, aby do toho kompilator nevidel ...
Prasacina je to v kazdom pripade, co ostatne hovori aj komentar:
* Here we just change the eflags value on the stack
Je mi jasne, ze v jadre sa clovek podobnym hackom obcas nevyhne, ale
osobne by som podobne veci radsej videl ako assemblerovsky kod, nez
spoliehat sa na sposob prace konkretneho kompilatora :-(
Zdravi
--
Stano
Další informace o konferenci Linux