On Thu, May 25, 2023 at 4:40 AM Petr Pavlu <petr.pavlu@xxxxxxxx> wrote: > > kmod normally uses finit_module() only if a module is not compressed, > otherwise it decompresses it first and then invokes init_module(). Note that it would probably be good to teach Fedora and SuSE to use the kernel-side decompression, if only because we have it and would like to try to avoid using the old "load contents from user memory". Mainly because it allows security modules to actively check for tampering (ie things like verity etc). Long-term, it would be good to just deprecate the old init_module() entirely. But yes: > It means that these and similarly organized distributions end up using > init_module(), and adding complexity to optimize finit_module() wouldn't > actually help in their case. Yeah, I think the real bug is absolutely in udev, and trying to load the same module hundreds of times is very very wrong. So I think the "mitigate it in the kernel" is at most a quick hack to fix user-space brokenness. And I don't think 1/2 is acceptable as that "quick hack". Not at all. It also seems fundamentally buggy, as it uses purely the inode number as the file identity, which means that it does bad things across filesystem limits. That said, I posted an alternate patch that I think _is_ valid as that quick hack. I don't love it, but it sure is simpler (and avoids the i_ino bug): https://lore.kernel.org/lkml/CAHk-=wgKu=tJf1bm_dtme4Hde4zTB=_7EdgR8avsDRK4_jD+uA@xxxxxxxxxxxxxx/ that patch hasn't seen any testing, and for all I know it won't even boot because of some thinko, but I think it would be acceptable as a workaround if it does work. But no, it's not some kind of "fix" for the bug, and yes, using init_module() rather than finit_module() will circumvent the quick hack. The true fix would be for udev to do proper handling of its data structures instead of randomly spraying duplicate module loading events. I don't know why udev does what it does. From what Luis told me, apparently it's just forking stuff and keeping all its data structures in memory, and has no actual consistency or locking or memory of what it has done. Luis pointed me at https://lore.kernel.org/all/23bd0ce6-ef78-1cd8-1f21-0e706a00424a@xxxxxxxx/T/#u for some udev background. It's been about a decade since I looked at udev sources, and none of this encourages me to take a second look, so all of the above may be me misunderstanding just exactly what the udev problem is. But for that 'finit' case, we *could* try that simple hack of mine. I say "hack", but the patch really is pretty simple, and the concept of "exclusive special access" certainly is not some hack in itself. It's just not anything we've ever done before. So the hackishness from that exclusive_deny_write_access() thing in my patch is mainly that it shouldn't be needed at all (and that the exclusivity should probably be set some other way). Comments welcome. Linus