diff options
author | bingtian.ly@taobao.com <bingtian.ly@taobao.com> | 2013-01-23 20:35:28 +0000 |
---|---|---|
committer | Willy Tarreau <w@1wt.eu> | 2015-05-24 10:10:48 +0200 |
commit | 0f8a4ca10ec65ffad4b6a8800d59e2ab5a1ddb31 (patch) | |
tree | 065c59a52049badf3089a21a99a6ef43413ea10d /net | |
parent | 65f26669f828edb1d964858236bef7ea18a7c816 (diff) |
net: avoid to hang up on sending due to sysctl configuration overflow.
commit cdda88912d62f9603d27433338a18be83ef23ac1 upstream.
I found if we write a larger than 4GB value to some sysctl
variables, the sending syscall will hang up forever, because these
variables are 32 bits, such large values make them overflow to 0 or
negative.
This patch try to fix overflow or prevent from zero value setup
of below sysctl variables:
net.core.wmem_default
net.core.rmem_default
net.core.rmem_max
net.core.wmem_max
net.ipv4.udp_rmem_min
net.ipv4.udp_wmem_min
net.ipv4.tcp_wmem
net.ipv4.tcp_rmem
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Li Yu <raise.sail@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[bwh: Backported to 3.2:
- Adjust context
- Delete now-unused 'zero' variable]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
(cherry picked from commit 98eee187cdee2807bd80e6c02180c5c2abae6453)
[wt: backported to 2.6.32: set strategy to sysctl_intvec where relevant]
Signed-off-by: Willy Tarreau <w@1wt.eu>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/sysctl_net_core.c | 18 | ||||
-rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 13 |
2 files changed, 23 insertions, 8 deletions
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index e6bf72ce2fa7..a6003283ea0b 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c @@ -17,6 +17,8 @@ static int zero = 0; static int ushort_max = 65535; +static int one = 1; + static struct ctl_table net_core_table[] = { #ifdef CONFIG_NET { @@ -25,7 +27,9 @@ static struct ctl_table net_core_table[] = { .data = &sysctl_wmem_max, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .strategy = sysctl_intvec, + .extra1 = &one, }, { .ctl_name = NET_CORE_RMEM_MAX, @@ -33,7 +37,9 @@ static struct ctl_table net_core_table[] = { .data = &sysctl_rmem_max, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .strategy = sysctl_intvec, + .extra1 = &one, }, { .ctl_name = NET_CORE_WMEM_DEFAULT, @@ -41,7 +47,9 @@ static struct ctl_table net_core_table[] = { .data = &sysctl_wmem_default, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .strategy = sysctl_intvec, + .extra1 = &one, }, { .ctl_name = NET_CORE_RMEM_DEFAULT, @@ -49,7 +57,9 @@ static struct ctl_table net_core_table[] = { .data = &sysctl_rmem_default, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .strategy = sysctl_intvec, + .extra1 = &one, }, { .ctl_name = NET_CORE_DEV_WEIGHT, diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index d957371a80d0..d1a8883297cf 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -22,6 +22,7 @@ #include <net/inet_frag.h> static int zero; +static int one = 1; static int tcp_retr1_max = 255; static int tcp_syn_retries_min = 1; static int tcp_syn_retries_max = MAX_TCP_SYNCNT; @@ -521,7 +522,9 @@ static struct ctl_table ipv4_table[] = { .data = &sysctl_tcp_wmem, .maxlen = sizeof(sysctl_tcp_wmem), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .strategy = sysctl_intvec, + .extra1 = &one, }, { .ctl_name = NET_TCP_RMEM, @@ -529,7 +532,9 @@ static struct ctl_table ipv4_table[] = { .data = &sysctl_tcp_rmem, .maxlen = sizeof(sysctl_tcp_rmem), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .strategy = sysctl_intvec, + .extra1 = &one, }, { .ctl_name = NET_TCP_APP_WIN, @@ -735,7 +740,7 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec_minmax, .strategy = sysctl_intvec, - .extra1 = &zero + .extra1 = &one }, { .ctl_name = CTL_UNNUMBERED, @@ -745,7 +750,7 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec_minmax, .strategy = sysctl_intvec, - .extra1 = &zero + .extra1 = &one }, { .ctl_name = 0 } }; |