ipv4: fix ip header ident selection in __ip_make_skb()
authorEric Dumazet <edumazet@google.com>
Mon, 20 Aug 2012 07:26:45 +0000 (07:26 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Aug 2012 21:51:06 +0000 (14:51 -0700)
Christian Casteyde reported a kmemcheck 32-bit read from uninitialized
memory in __ip_select_ident().

It turns out that __ip_make_skb() called ip_select_ident() before
properly initializing iph->daddr.

This is a bug uncovered by commit 1d861aa4b3fb (inet: Minimize use of
cached route inetpeer.)

Addresses https://bugzilla.kernel.org/show_bug.cgi?id=46131

Reported-by: Christian Casteyde <casteyde.christian@free.fr>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_output.c

index 147ccc3e93db08de8ba0c6ab0cc255b639eafdbb..c196d749daf23b3823ffe012495ea5d9411be99a 100644 (file)
@@ -1338,10 +1338,10 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
        iph->ihl = 5;
        iph->tos = inet->tos;
        iph->frag_off = df;
-       ip_select_ident(iph, &rt->dst, sk);
        iph->ttl = ttl;
        iph->protocol = sk->sk_protocol;
        ip_copy_addrs(iph, fl4);
+       ip_select_ident(iph, &rt->dst, sk);
 
        if (opt) {
                iph->ihl += opt->optlen>>2;