diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2008-01-08 23:39:06 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-08 23:39:06 -0800 |
commit | 0f99be0d115a5716292c58dfdb20d2eddd0f3387 (patch) | |
tree | a4c8fc6262add152fa7207e40a5f02b18c9bedde /include/net/xfrm.h | |
parent | 2e3884b5b16795c03a7bf295797c1b2402885b88 (diff) | |
download | op-kernel-dev-0f99be0d115a5716292c58dfdb20d2eddd0f3387.zip op-kernel-dev-0f99be0d115a5716292c58dfdb20d2eddd0f3387.tar.gz |
[XFRM]: xfrm_algo_clone() allocates too much memory
alg_key_len is the length in bits of the key, not in bytes.
Best way to fix this is to move alg_len() function from net/xfrm/xfrm_user.c
to include/net/xfrm.h, and to use it in xfrm_algo_clone()
alg_len() is renamed to xfrm_alg_len() because of its global exposition.
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/xfrm.h')
-rw-r--r-- | include/net/xfrm.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 58dfa828..1dd20cf 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -1188,10 +1188,15 @@ static inline int xfrm_aevent_is_on(void) return ret; } +static inline int xfrm_alg_len(struct xfrm_algo *alg) +{ + return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); +} + #ifdef CONFIG_XFRM_MIGRATE static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) { - return (struct xfrm_algo *)kmemdup(orig, sizeof(*orig) + orig->alg_key_len, GFP_KERNEL); + return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); } static inline void xfrm_states_put(struct xfrm_state **states, int n) |