On Mon, Aug 15, 2005 at 09:45:22AM +0200, Patrick McHardy ([EMAIL PROTECTED]) 
wrote:
> David S. Miller wrote:
> >I applied patches 1 -> 7, but I had to stop after that.
> >
> >This patch here will break netlink on my workstation :-)
> >
> >These "u32" tricks with nlk->groups[0] will not work on
> >big-endian 64-bit.  If unsigned long is 64-bit, you end
> >up accessing bits 32-63 of nlk->groups[0] in some instances
> >and then bits 0-31 in other situations.
> >
> >Please redo this patch, then I'll apply it and the rest.
> >You only need resend the fixed version of patch 8.
> 
> This one should fix the problem. I also redid 9, it was missing a
> permission check for joining groups.

> [NETLINK]: Support dynamic number of multicast groups per netlink family
> 
> Signed-off-by: Patrick McHardy <[EMAIL PROTECTED]>
> 
> ---
> commit 5a78d0310e5039009bceab69f8b4de05b0ae73de
> tree dfa621961787223780026b7ffc51eaad85de8424
> parent 159b54716bcf5aea4c3141a64072613db7934e11
> author Patrick McHardy <[EMAIL PROTECTED]> Mon, 15 Aug 2005 09:22:12 +0200
> committer Patrick McHardy <[EMAIL PROTECTED]> Mon, 15 Aug 2005 09:22:12 +0200
> 
>  net/netlink/af_netlink.c |   69 
> ++++++++++++++++++++++++++++++++++------------
>  1 files changed, 51 insertions(+), 18 deletions(-)
> 
> diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
> --- a/net/netlink/af_netlink.c
> +++ b/net/netlink/af_netlink.c
> @@ -60,21 +60,24 @@
>  #include <net/scm.h>
>  
>  #define Nprintk(a...)
> +#define NLGRPSZ(x)   (ALIGN(x, sizeof(unsigned long) * 8) / 8)
>  
>  struct netlink_sock {
>       /* struct sock has to be the first member of netlink_sock */
>       struct sock             sk;
>       u32                     pid;
> -     unsigned int            groups;
>       u32                     dst_pid;
>       u32                     dst_group;
> +     u32                     flags;
> +     u32                     subscriptions;
> +     u32                     ngroups;
> +     unsigned long           *groups;
>       unsigned long           state;
>       wait_queue_head_t       wait;
>       struct netlink_callback *cb;
>       spinlock_t              cb_lock;
>       void                    (*data_ready)(struct sock *sk, int bytes);
>       struct module           *module;
> -     u32                     flags;
>  };
...
> +     nlk->groups = kmalloc(NLGRPSZ(groups), GFP_KERNEL);
> +     if (nlk->groups == NULL) {
> +             err = -ENOMEM;
>               goto out_module;
> +     }
> +     memset(nlk->groups, 0, NLGRPSZ(groups));
> +     nlk->ngroups = groups;
...  
> -     if (!nladdr->nl_groups && !nlk->groups)
> +     if (!nladdr->nl_groups && !(u32)nlk->groups[0])
>               return 0;
...
> +     nlk->groups[0] = (nlk->groups[0] & ~0xffffffffUL) | nladdr->nl_groups; 
>       netlink_table_ungrab();

I have some doubt about 64bit platforms.

>       return 0;
> @@ -590,7 +619,7 @@ static int netlink_getname(struct socket
>               nladdr->nl_groups = netlink_group_mask(nlk->dst_group);
>       } else {
>               nladdr->nl_pid = nlk->pid;
> -             nladdr->nl_groups = nlk->groups; 
> +             nladdr->nl_groups = nlk->groups[0];

And here too.

nlk->groups[0] is an unsigned long, which is 64bit on 64bit platforms.

-- 
        Evgeniy Polyakov
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to