Now it looks good. You can add an "Acked-by" from me and send it to netdev. 
Note that the patch must be directed to 'net', not 'net-next', since it is a 
bug correction.
You should also add a line "Fixes: " with reference to the  patch that 
introduced the problem. 

BR
///jon


> -----Original Message-----
> From: Haiqing Bai <haiqing....@windriver.com>
> Sent: Wednesday, 22 August, 2018 02:40
> To: tipc-discussion@lists.sourceforge.net
> Cc: Jon Maloy <jon.ma...@ericsson.com>; ying....@windriver.com; 
> da...@davemloft.net; zhenbo....@windriver.com;
> haiqing....@windriver.com
> Subject: [tipc-discussion][PATCH] tipc: fix the big/little endian issue in 
> tipc_dest
> 
> In function tipc_dest_push, the 32bit variables 'node' and 'port'
> are stored separately in uppper and lower part of 64bit 'value'.
> Then this value is assigned to dst->value which is a union like:
> union
> {
>   struct {
>     u32 port;
>     u32 node;
>   };
>   u64 value;
> }
> This works on little-endian machines like x86 but fails on big-endian
> machines.
> 
> The fix remove the 'value' stack parameter and even the 'value'
> member of the union in tipc_dest, assign the 'node' and 'port' member
> directly with the input parameter to avoid the endian issue.
> 
> Signed-off-by: Zhenbo Gao <zhenbo....@windriver.com>
> Signed-off-by: Haiqing Bai <haiqing....@windriver.com>
> ---
>  net/tipc/name_table.c | 10 ++++------
>  net/tipc/name_table.h |  9 ++-------
>  2 files changed, 6 insertions(+), 13 deletions(-)
> 
> diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
> index ed0457c..664c644 100644
> --- a/net/tipc/name_table.c
> +++ b/net/tipc/name_table.c
> @@ -1117,20 +1117,17 @@ int tipc_nl_name_table_dump(struct sk_buff *skb, 
> struct netlink_callback *cb)
> 
>  struct tipc_dest *tipc_dest_find(struct list_head *l, u32 node, u32 port)
>  {
> -     u64 value = (u64)node << 32 | port;
>       struct tipc_dest *dst;
> 
>       list_for_each_entry(dst, l, list) {
> -             if (dst->value != value)
> -                     continue;
> -             return dst;
> +             if (dst->node == node && dst->port == port)
> +                     return dst;
>       }
>       return NULL;
>  }
> 
>  bool tipc_dest_push(struct list_head *l, u32 node, u32 port)
>  {
> -     u64 value = (u64)node << 32 | port;
>       struct tipc_dest *dst;
> 
>       if (tipc_dest_find(l, node, port))
> @@ -1139,7 +1136,8 @@ bool tipc_dest_push(struct list_head *l, u32 node, u32 
> port)
>       dst = kmalloc(sizeof(*dst), GFP_ATOMIC);
>       if (unlikely(!dst))
>               return false;
> -     dst->value = value;
> +     dst->node = node;
> +     dst->port = port;
>       list_add(&dst->list, l);
>       return true;
>  }
> diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h
> index f56e7cb..2395408 100644
> --- a/net/tipc/name_table.h
> +++ b/net/tipc/name_table.h
> @@ -127,13 +127,8 @@ void tipc_nametbl_stop(struct net *net);
> 
>  struct tipc_dest {
>       struct list_head list;
> -     union {
> -             struct {
> -                     u32 port;
> -                     u32 node;
> -             };
> -             u64 value;
> -     };
> +     u32 port;
> +     u32 node;
>  };
> 
>  struct tipc_dest *tipc_dest_find(struct list_head *l, u32 node, u32 port);
> --
> 1.9.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to