On Thu, 23 Aug 2001, Keith Owens wrote: > The definition of struct archdata in kernel and modutils can be > different, a new kernel layout with an old modutils is legal but fatal > unless you code for it. The correct test for archdata is > > if (!mod_member_present(mp, archdata_start) || > (mp->archdata_end - mp->archdata_start) <= > offsetof(struct archdata, dbe_table_end)) > continue; > > Do not use archdata unless it is at least large enough to contain > dbe_table_end. That test also takes care of NULL pointers, end - start > == 0 for NULL. Hmm, your suggested code checks if the passed struct is long enough for dbe_table_start only -- what about dbe_table_end? The following code: ap = (struct archdata *)(mod->archdata_start); if (!mod_member_present(mp, archdata_start) || (mp->archdata_end - mp->archdata_start) < offsetof(struct archdata, dbe_table_end) + sizeof(ap->dbe_table_end)) continue; should be stricter. While modutils as released won't ever pass a smaller struct, someone may modify them or use another program to invoke init_module(), so we need to protect the kernel against bogus data. > The rest of the code looks OK, except it needs a global change of > arch_init_module: to module_arch_init: to match the macro name. OK, I'll do it. It should have been done for ia64 in the first place. Or should it be changed into "<arch>_init_module" to match functions' real names? > Do you have the corresponding modutils patch or shall I do it? I've send it to you separately just after the kernel patch. Should I resend it? Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available +