On Tue, Jul 26, 2005 at 04:37:19PM -0700, David S. Miller wrote:
> From: Harald Welte <[EMAIL PROTECTED]>
> Date: Sat, 23 Jul 2005 16:15:52 -0400
> 
> > The attached patch adds support for refcounting of modules implementing
> > netlink protocols.  The idea is that you prevent the module from
> > disappearing as long as someone in userspace has still a socket talking
> > to you.
> 
> Ok, the changes look mostly fine.  I've made a few slight
> modifications before integrating, some of which I've mentioned
> already:
> 
> 1) I keep nl_table[] dynamically allocated
> 2) I fixed up some white spacing, very minor stuff
> 3) I fixed a socket leak in netlink_kernel_create().  If
>    netlink_lookup() returns non-NULL, you have a reference
>    to that socket thus have to release it.

thanks for taking care of this, and especially modifying the patch.  I
would have done that based on your comments, but well, if you want to do
it, it's more convenient for me ;)

> I'm only including the af_netlink.c part of that patch I integrated
> since that's the only part I modified compared to your original
> patch.

ok, I read through it and it seems fine to me.
 
> I think there is a slight hole in this code though, which we can
> fixup as a followon patch.  We probably need to grab the netlink
> table from the point at which we set p_ops all the way to where
> we full commit and netlink_insert() the kernel netlink socket.

mh, I have to think about that in more detail, will get back to you.

There's also a potential module refcounting leak when we have the
following order of events:

1) netlink_kernel_create()
2) userspace opens socket, increases refcount of kernel socket
3) sock_release(kernel_sock), resets p_ops to generic ones
4) userspace closes socket, but can no longer drop refcount on module 
   implementing the kernel socket.

I had a somewhat lengthy discussion with Thomas and Patrick about this,
and we didn't think it's worth fixing this up, esp. since all the
current users seem to sock_release only in the module unload path, which
can in turn only be invoked if the refcount is already zero.  The only
real solution for this is to split netlink_kernel_create() in two parts,
let's say netlink_proto_register and netlink_kernel_sock_create(), and
the same for sock_release() / netlink_proto_unregister().  Let me know
whether you think it's worth the effort.

Thanks,
        Harald
-- 
- Harald Welte <[EMAIL PROTECTED]>                 http://netfilter.org/
============================================================================
  "Fragmentation is like classful addressing -- an interesting early
   architectural error that shows how much experimentation was going
   on while IP was being designed."                    -- Paul Vixie

Attachment: pgpaKkcTCs0Uh.pgp
Description: PGP signature

Reply via email to