lkml.org 
[lkml]   [2015]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 32/48] net: avoid to hang up on sending due to sysctl configuration overflow.
    2.6.32-longterm review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "bingtian.ly@taobao.com" <bingtian.ly@taobao.com>

    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>
    ---
    net/core/sysctl_net_core.c | 18 ++++++++++++++----
    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 e6bf72c..a600328 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 d957371..d1a8883 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 }
    };
    --
    1.7.12.2.21.g234cd45.dirty




    \
     
     \ /
      Last update: 2015-05-15 10:41    [W:2.053 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site