summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Stevens <dlstevens@us.ibm.com>2004-02-24 08:24:37 -0800
committerPatrick McHardy <kaber@trash.net>2004-02-24 08:24:37 -0800
commit5c4cee5b0ac4205a896261f5a4607031010c7dbb (patch)
treee8fb5483665a9fc24299f1188692da15a4833485
parentd894b9155acb7bc04f7b6265f83a89f5bbf4a86c (diff)
[IGMP/MLD]: Check for numsrc overflow, plus temp buffer tweaks.
-rw-r--r--net/ipv4/ip_sockglue.c9
-rw-r--r--net/ipv6/ipv6_sockglue.c8
2 files changed, 15 insertions, 2 deletions
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index ec46daa8caba..d8f9eafe590f 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -617,10 +617,15 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
}
case IP_MSFILTER:
{
+ extern int sysctl_optmem_max;
struct ip_msfilter *msf;
if (optlen < IP_MSFILTER_SIZE(0))
goto e_inval;
+ if (optlen > sysctl_optmem_max) {
+ err = -ENOBUFS;
+ break;
+ }
msf = (struct ip_msfilter *)kmalloc(optlen, GFP_KERNEL);
if (msf == 0) {
err = -ENOBUFS;
@@ -631,7 +636,9 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
kfree(msf);
break;
}
- if (IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) {
+ if (IP_MSFILTER_SIZE(msf->imsf_numsrc) <
+ IP_MSFILTER_SIZE(0) ||
+ IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) {
kfree(msf);
err = -EINVAL;
break;
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index 320c185f8cf5..1b28ffcefc4e 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -436,10 +436,15 @@ done:
}
case MCAST_MSFILTER:
{
+ extern int sysctl_optmem_max;
struct group_filter *gsf;
if (optlen < GROUP_FILTER_SIZE(0))
goto e_inval;
+ if (optlen > sysctl_optmem_max) {
+ retv = -ENOBUFS;
+ break;
+ }
gsf = (struct group_filter *)kmalloc(optlen,GFP_KERNEL);
if (gsf == 0) {
retv = -ENOBUFS;
@@ -450,7 +455,8 @@ done:
kfree(gsf);
break;
}
- if (GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) {
+ if (GROUP_FILTER_SIZE(gsf->gf_numsrc) < GROUP_FILTER_SIZE(0) ||
+ GROUP_FILTER_SIZE(gsf->gf_numsrc) > optlen) {
kfree(gsf);
retv = -EINVAL;
break;