| From 0a704e7e728720f51c66957653eef0dd4cc858c6 Mon Sep 17 00:00:00 2001 |
| From: Dmitry Popov <dp@highloadlab.com> |
| Date: Thu, 29 Jul 2010 01:59:36 +0000 |
| Subject: tcp: cookie transactions setsockopt memory leak |
| |
| |
| From: Dmitry Popov <dp@highloadlab.com> |
| |
| [ Upstream commit a3bdb549e30e7a263f7a589747c40e9c50110315 ] |
| |
| There is a bug in do_tcp_setsockopt(net/ipv4/tcp.c), |
| TCP_COOKIE_TRANSACTIONS case. |
| In some cases (when tp->cookie_values == NULL) new tcp_cookie_values |
| structure can be allocated (at cvp), but not bound to |
| tp->cookie_values. So a memory leak occurs. |
| |
| Signed-off-by: Dmitry Popov <dp@highloadlab.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| net/ipv4/tcp.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/net/ipv4/tcp.c |
| +++ b/net/ipv4/tcp.c |
| @@ -2175,6 +2175,8 @@ static int do_tcp_setsockopt(struct sock |
| GFP_KERNEL); |
| if (cvp == NULL) |
| return -ENOMEM; |
| + |
| + kref_init(&cvp->kref); |
| } |
| lock_sock(sk); |
| tp->rx_opt.cookie_in_always = |
| @@ -2189,12 +2191,11 @@ static int do_tcp_setsockopt(struct sock |
| */ |
| kref_put(&tp->cookie_values->kref, |
| tcp_cookie_values_release); |
| - kref_init(&cvp->kref); |
| - tp->cookie_values = cvp; |
| } else { |
| cvp = tp->cookie_values; |
| } |
| } |
| + |
| if (cvp != NULL) { |
| cvp->cookie_desired = ctd.tcpct_cookie_desired; |
| |
| @@ -2208,6 +2209,8 @@ static int do_tcp_setsockopt(struct sock |
| cvp->s_data_desired = ctd.tcpct_s_data_desired; |
| cvp->s_data_constant = 0; /* false */ |
| } |
| + |
| + tp->cookie_values = cvp; |
| } |
| release_sock(sk); |
| return err; |