ndisc: Fix padding error in link-layer address option.
authorYOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org>
Thu, 13 Dec 2012 04:29:36 +0000 (04:29 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Dec 2012 17:58:11 +0000 (12:58 -0500)
If a natural number n exists where 2 + data_len <= 8n < 2 + data_len + pad,
post padding is not initialized correctly.

(Un)fortunately, the only type that requires pad is Infiniband,
whose pad is 2 and data_len is 20, and this logical error has not
become obvious, but it is better to fix.

Note that ndisc_opt_addr_space() handles the situation described
above correctly.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ndisc.c

index 4c02e6ab96e7d2990adcda4afa1dc8bac63e1b5c..f2a007b7bde34d38f5b9b7f49c41ce77b136d04c 100644 (file)
@@ -151,8 +151,8 @@ static inline int ndisc_opt_addr_space(struct net_device *dev)
 static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
                                  unsigned short addr_type)
 {
 static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
                                  unsigned short addr_type)
 {
-       int space = NDISC_OPT_SPACE(data_len);
        int pad   = ndisc_addr_option_pad(addr_type);
        int pad   = ndisc_addr_option_pad(addr_type);
+       int space = NDISC_OPT_SPACE(data_len + pad);
 
        opt[0] = type;
        opt[1] = space>>3;
 
        opt[0] = type;
        opt[1] = space>>3;