aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2007-08-22 16:56:23 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:48:21 -0400
commitc26445acbc292ab0466407db6d3bdcc5cbe1d03b (patch)
tree15cc1f7b56929ffd269d5960d130e5c30c47277b
parentc0144beaeca42b643f4d1632f2b24fdc6c48a170 (diff)
[XFRM] netlink: Move algorithm length calculation to its own function
Adds alg_len() to calculate the properly padded length of an algorithm attribute to simplify the code. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/xfrm/xfrm_user.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index 24a97b1179f8..30e47c678d5e 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -33,6 +33,11 @@
33#endif 33#endif
34#include <linux/audit.h> 34#include <linux/audit.h>
35 35
36static inline int alg_len(struct xfrm_algo *alg)
37{
38 return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
39}
40
36static int verify_one_alg(struct rtattr **xfrma, enum xfrm_attr_type_t type) 41static int verify_one_alg(struct rtattr **xfrma, enum xfrm_attr_type_t type)
37{ 42{
38 struct rtattr *rt = xfrma[type - 1]; 43 struct rtattr *rt = xfrma[type - 1];
@@ -232,7 +237,6 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
232 struct rtattr *rta = u_arg; 237 struct rtattr *rta = u_arg;
233 struct xfrm_algo *p, *ualg; 238 struct xfrm_algo *p, *ualg;
234 struct xfrm_algo_desc *algo; 239 struct xfrm_algo_desc *algo;
235 int len;
236 240
237 if (!rta) 241 if (!rta)
238 return 0; 242 return 0;
@@ -244,8 +248,7 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
244 return -ENOSYS; 248 return -ENOSYS;
245 *props = algo->desc.sadb_alg_id; 249 *props = algo->desc.sadb_alg_id;
246 250
247 len = sizeof(*ualg) + (ualg->alg_key_len + 7U) / 8; 251 p = kmemdup(ualg, alg_len(ualg), GFP_KERNEL);
248 p = kmemdup(ualg, len, GFP_KERNEL);
249 if (!p) 252 if (!p)
250 return -ENOMEM; 253 return -ENOMEM;
251 254
@@ -617,11 +620,9 @@ static int dump_one_state(struct xfrm_state *x, int count, void *ptr)
617 copy_to_user_state(x, p); 620 copy_to_user_state(x, p);
618 621
619 if (x->aalg) 622 if (x->aalg)
620 NLA_PUT(skb, XFRMA_ALG_AUTH, 623 NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg);
621 sizeof(*(x->aalg))+(x->aalg->alg_key_len+7)/8, x->aalg);
622 if (x->ealg) 624 if (x->ealg)
623 NLA_PUT(skb, XFRMA_ALG_CRYPT, 625 NLA_PUT(skb, XFRMA_ALG_CRYPT, alg_len(x->ealg), x->ealg);
624 sizeof(*(x->ealg))+(x->ealg->alg_key_len+7)/8, x->ealg);
625 if (x->calg) 626 if (x->calg)
626 NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg); 627 NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg);
627 628
@@ -2072,9 +2073,9 @@ static inline int xfrm_sa_len(struct xfrm_state *x)
2072{ 2073{
2073 int l = 0; 2074 int l = 0;
2074 if (x->aalg) 2075 if (x->aalg)
2075 l += RTA_SPACE(sizeof(*x->aalg) + (x->aalg->alg_key_len+7)/8); 2076 l += RTA_SPACE(alg_len(x->aalg));
2076 if (x->ealg) 2077 if (x->ealg)
2077 l += RTA_SPACE(sizeof(*x->ealg) + (x->ealg->alg_key_len+7)/8); 2078 l += RTA_SPACE(alg_len(x->ealg));
2078 if (x->calg) 2079 if (x->calg)
2079 l += RTA_SPACE(sizeof(*x->calg)); 2080 l += RTA_SPACE(sizeof(*x->calg));
2080 if (x->encap) 2081 if (x->encap)
@@ -2127,11 +2128,9 @@ static int xfrm_notify_sa(struct xfrm_state *x, struct km_event *c)
2127 copy_to_user_state(x, p); 2128 copy_to_user_state(x, p);
2128 2129
2129 if (x->aalg) 2130 if (x->aalg)
2130 NLA_PUT(skb, XFRMA_ALG_AUTH, 2131 NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg);
2131 sizeof(*(x->aalg))+(x->aalg->alg_key_len+7)/8, x->aalg);
2132 if (x->ealg) 2132 if (x->ealg)
2133 NLA_PUT(skb, XFRMA_ALG_CRYPT, 2133 NLA_PUT(skb, XFRMA_ALG_CRYPT, alg_len(x->ealg), x->ealg);
2134 sizeof(*(x->ealg))+(x->ealg->alg_key_len+7)/8, x->ealg);
2135 if (x->calg) 2134 if (x->calg)
2136 NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg); 2135 NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg);
2137 2136