diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-07-01 02:12:43 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-07-01 02:12:43 +0000 |
commit | 13ea39a34766fcbecd96ab94bcdf798b08e9bb60 (patch) | |
tree | 1e1463b03838a6f36868a4dafc7e652358a51857 /pfinet/linux-src/net/ipv4/ip_options.c | |
parent | 1f8d504f631531c199d7c6154a0dc442d80ea4a7 (diff) | |
parent | 7e15f3d69a83a34ac62cbbee944a0bfbfa92724e (diff) | |
download | hurd-13ea39a34766fcbecd96ab94bcdf798b08e9bb60.tar.gz hurd-13ea39a34766fcbecd96ab94bcdf798b08e9bb60.tar.bz2 hurd-13ea39a34766fcbecd96ab94bcdf798b08e9bb60.zip |
Merge branch 'master' into xkb
Conflicts:
config.make.in
configure.in
Diffstat (limited to 'pfinet/linux-src/net/ipv4/ip_options.c')
-rw-r--r-- | pfinet/linux-src/net/ipv4/ip_options.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/pfinet/linux-src/net/ipv4/ip_options.c b/pfinet/linux-src/net/ipv4/ip_options.c index a3d1f0aa..ec21054d 100644 --- a/pfinet/linux-src/net/ipv4/ip_options.c +++ b/pfinet/linux-src/net/ipv4/ip_options.c @@ -491,15 +491,18 @@ void ip_options_undo(struct ip_options * opt) int ip_options_get(struct ip_options **optp, unsigned char *data, int optlen, int user) { struct ip_options *opt; + size_t opt_size = sizeof(struct ip_options)+((optlen+3)&~3); - opt = kmalloc(sizeof(struct ip_options)+((optlen+3)&~3), GFP_KERNEL); + opt = kmalloc(opt_size, GFP_KERNEL); if (!opt) return -ENOMEM; memset(opt, 0, sizeof(struct ip_options)); if (optlen) { if (user) { - if (copy_from_user(opt->__data, data, optlen)) + if (copy_from_user(opt->__data, data, optlen)) { + kfree_s(opt, opt_size); return -EFAULT; + } } else memcpy(opt->__data, data, optlen); } @@ -509,7 +512,7 @@ int ip_options_get(struct ip_options **optp, unsigned char *data, int optlen, in opt->is_data = 1; opt->is_setbyuser = 1; if (optlen && ip_options_compile(opt, NULL)) { - kfree_s(opt, sizeof(struct ip_options) + optlen); + kfree_s(opt, opt_size); return -EINVAL; } *optp = opt; |