diff options
author | Vegard Nossum <vegard.nossum@gmail.com> | 2008-09-12 19:17:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-09-12 19:17:43 -0400 |
commit | 78d15e82754945ee9821fb491b57faf43abfb9d7 (patch) | |
tree | ac5695ad20aafc333729f2392465645a580a8b8a /net | |
parent | f262b59becc3f557da6460232abac13706402849 (diff) |
tcp_ipv6: fix use of uninitialized memory
inet6_rsk() is called on a struct request_sock * before we
have checked whether the socket is an ipv6 socket or a ipv6-
mapped ipv4 socket. The access that triggers this is the
inet_rsk(rsk)->inet6_rsk_offset dereference in inet6_rsk().
This is arguably not a critical error as the inet6_rsk_offset
is only used to compute a pointer which is never really used
(in the code path in question) anyway. But it might be a
latent error, so let's fix it.
Spotted by kmemcheck.
Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com>
Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index b585c850a89a..e85f377a8f82 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1286,7 +1286,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1286 | struct request_sock *req, | 1286 | struct request_sock *req, |
1287 | struct dst_entry *dst) | 1287 | struct dst_entry *dst) |
1288 | { | 1288 | { |
1289 | struct inet6_request_sock *treq = inet6_rsk(req); | 1289 | struct inet6_request_sock *treq; |
1290 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); | 1290 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); |
1291 | struct tcp6_sock *newtcp6sk; | 1291 | struct tcp6_sock *newtcp6sk; |
1292 | struct inet_sock *newinet; | 1292 | struct inet_sock *newinet; |
@@ -1350,6 +1350,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1350 | return newsk; | 1350 | return newsk; |
1351 | } | 1351 | } |
1352 | 1352 | ||
1353 | treq = inet6_rsk(req); | ||
1353 | opt = np->opt; | 1354 | opt = np->opt; |
1354 | 1355 | ||
1355 | if (sk_acceptq_is_full(sk)) | 1356 | if (sk_acceptq_is_full(sk)) |