lkml.org 
[lkml]   [2012]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[v2.6.34-stable 099/165] scm: lower SCM_MAX_FD
    Date
    From: Eric Dumazet <eric.dumazet@gmail.com>

    -------------------
    This is a commit scheduled for the next v2.6.34 longterm release.
    http://git.kernel.org/?p=linux/kernel/git/paulg/longterm-queue-2.6.34.git
    If you see a problem with using this for longterm, please comment.
    -------------------

    commit bba14de98753cb6599a2dae0e520714b2153522d upstream.

    Lower SCM_MAX_FD from 255 to 253 so that allocations for scm_fp_list are
    halved. (commit f8d570a4 added two pointers in this structure)

    scm_fp_dup() should not copy whole structure (and trigger kmemcheck
    warnings), but only the used part. While we are at it, only allocate
    needed size.

    Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    ---
    include/net/scm.h | 5 +++--
    net/core/scm.c | 10 ++++++----
    2 files changed, 9 insertions(+), 6 deletions(-)

    diff --git a/include/net/scm.h b/include/net/scm.h
    index 8360e47..8b5cccd 100644
    --- a/include/net/scm.h
    +++ b/include/net/scm.h
    @@ -10,11 +10,12 @@
    /* Well, we should have at least one descriptor open
    * to accept passed FDs 8)
    */
    -#define SCM_MAX_FD 255
    +#define SCM_MAX_FD 253

    struct scm_fp_list {
    struct list_head list;
    - int count;
    + short count;
    + short max;
    struct file *fp[SCM_MAX_FD];
    };

    diff --git a/net/core/scm.c b/net/core/scm.c
    index b88f6f9..ddc0448 100644
    --- a/net/core/scm.c
    +++ b/net/core/scm.c
    @@ -79,10 +79,11 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
    return -ENOMEM;
    *fplp = fpl;
    fpl->count = 0;
    + fpl->max = SCM_MAX_FD;
    }
    fpp = &fpl->fp[fpl->count];

    - if (fpl->count + num > SCM_MAX_FD)
    + if (fpl->count + num > fpl->max)
    return -EINVAL;

    /*
    @@ -303,11 +304,12 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl)
    if (!fpl)
    return NULL;

    - new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL);
    + new_fpl = kmemdup(fpl, offsetof(struct scm_fp_list, fp[fpl->count]),
    + GFP_KERNEL);
    if (new_fpl) {
    - for (i=fpl->count-1; i>=0; i--)
    + for (i = 0; i < fpl->count; i++)
    get_file(fpl->fp[i]);
    - memcpy(new_fpl, fpl, sizeof(*fpl));
    + new_fpl->max = new_fpl->count;
    }
    return new_fpl;
    }
    --
    1.7.12.rc2


    \
     
     \ /
      Last update: 2012-08-16 00:42    [W:3.088 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site