diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-11-23 14:09:15 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-11-07 13:47:36 -0800 |
commit | fa0a1136645f7a31c789d46272af3b298390c4e0 (patch) | |
tree | 79416caf2e24b196a737c37a78de5a5fccdb57bd | |
parent | 425f213726d314c0820a63cac1389d19a76df37f (diff) | |
download | linux-stable-fa0a1136645f7a31c789d46272af3b298390c4e0.tar.gz linux-stable-fa0a1136645f7a31c789d46272af3b298390c4e0.tar.bz2 linux-stable-fa0a1136645f7a31c789d46272af3b298390c4e0.zip |
scm: lower SCM_MAX_FD
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: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | include/net/scm.h | 5 | ||||
-rw-r--r-- | 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 8360e47aa7e3..8b5cccd9eb32 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 9b264634acfd..d98eafc7eec3 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -78,10 +78,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; /* @@ -302,11 +303,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; } |