[PATCH] KEY: Fix conversion between IPSEC_MODE_xxx and XFRM_MODE_xxx.

2007-04-17 Thread YOSHIFUJI Hideaki / 吉藤英明
From: Kazunori MIYAZAWA <[EMAIL PROTECTED]>
Subject: [PATCH] KEY: Fix conversion between IPSEC_MODE_xxx and XFRM_MODE_xxx.

We should not blindly convert between IPSEC_MODE_xxx and XFRM_MODE_xxx just
by incrementing / decrementing because the assumption is not true any longer.

Signed-off-by: Kazunori MIYAZAWA <[EMAIL PROTECTED]>
Singed-off-by: YOSHIFUJI Hideaki <[EMAIL PROTECTED]>

diff --git a/net/key/af_key.c b/net/key/af_key.c
index 90deefe..a61e6f6 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -630,6 +630,35 @@ #endif
/* NOTREACHED */
 }
 
+static inline int pfkey_mode_from_xfrm(int mode)
+{
+   switch(mode) {
+   case XFRM_MODE_TRANSPORT:
+   return IPSEC_MODE_TRANSPORT;
+   case XFRM_MODE_TUNNEL:
+   return IPSEC_MODE_TUNNEL;
+   case XFRM_MODE_BEET:
+   return IPSEC_MODE_BEET;
+   default:
+   return -1;
+   }
+}
+
+static inline int pfkey_mode_to_xfrm(int mode)
+{
+   switch(mode) {
+   case IPSEC_MODE_ANY:/*XXX*/
+   case IPSEC_MODE_TRANSPORT:
+   return XFRM_MODE_TRANSPORT;
+   case IPSEC_MODE_TUNNEL:
+   return XFRM_MODE_TUNNEL;
+   case IPSEC_MODE_BEET:
+   return XFRM_MODE_BEET;
+   default:
+   return -1;
+   }
+}
+
 static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int 
add_keys, int hsc)
 {
struct sk_buff *skb;
@@ -651,6 +680,7 @@ #endif
int encrypt_key_size = 0;
int sockaddr_size;
struct xfrm_encap_tmpl *natt = NULL;
+   int mode;
 
/* address family check */
sockaddr_size = pfkey_sockaddr_size(x->props.family);
@@ -928,7 +958,11 @@ #endif
sa2 = (struct sadb_x_sa2 *)  skb_put(skb, sizeof(struct sadb_x_sa2));
sa2->sadb_x_sa2_len = sizeof(struct sadb_x_sa2)/sizeof(uint64_t);
sa2->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
-   sa2->sadb_x_sa2_mode = x->props.mode + 1;
+   if ((mode = pfkey_mode_from_xfrm(x->props.mode)) < 0) {
+   kfree_skb(skb);
+   return ERR_PTR(-EINVAL);
+   }
+   sa2->sadb_x_sa2_mode = mode;
sa2->sadb_x_sa2_reserved1 = 0;
sa2->sadb_x_sa2_reserved2 = 0;
sa2->sadb_x_sa2_sequence = 0;
@@ -1155,9 +1189,12 @@ static struct xfrm_state * pfkey_msg2xfr
 
if (ext_hdrs[SADB_X_EXT_SA2-1]) {
struct sadb_x_sa2 *sa2 = (void*)ext_hdrs[SADB_X_EXT_SA2-1];
-   x->props.mode = sa2->sadb_x_sa2_mode;
-   if (x->props.mode)
-   x->props.mode--;
+   int mode = pfkey_mode_to_xfrm(sa2->sadb_x_sa2_mode);
+   if (mode < 0) {
+   err = -EINVAL;
+   goto out;
+   }
+   x->props.mode = mode;
x->props.reqid = sa2->sadb_x_sa2_reqid;
}
 
@@ -1218,7 +1255,7 @@ static int pfkey_getspi(struct sock *sk,
struct sadb_address *saddr, *daddr;
struct sadb_msg *out_hdr;
struct xfrm_state *x = NULL;
-   u8 mode;
+   int mode;
u32 reqid;
u8 proto;
unsigned short family;
@@ -1233,7 +1270,9 @@ static int pfkey_getspi(struct sock *sk,
return -EINVAL;
 
if ((sa2 = ext_hdrs[SADB_X_EXT_SA2-1]) != NULL) {
-   mode = sa2->sadb_x_sa2_mode - 1;
+   mode = pfkey_mode_to_xfrm(sa2->sadb_x_sa2_mode);
+   if (mode < 0)
+   return -EINVAL;
reqid = sa2->sadb_x_sa2_reqid;
} else {
mode = 0;
@@ -1756,6 +1795,7 @@ parse_ipsecrequest(struct xfrm_policy *x
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
struct sockaddr_in6 *sin6;
 #endif
+   int mode;
 
if (xp->xfrm_nr >= XFRM_MAX_DEPTH)
return -ELOOP;
@@ -1764,7 +1804,9 @@ #endif
return -EINVAL;
 
t->id.proto = rq->sadb_x_ipsecrequest_proto; /* XXX check proto */
-   t->mode = rq->sadb_x_ipsecrequest_mode-1;
+   if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0)
+   return -EINVAL;
+   t->mode = mode;
if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE)
t->optional = 1;
else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
@@ -1877,7 +1919,7 @@ static struct sk_buff * pfkey_xfrm_polic
return skb;
 }
 
-static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, 
int dir)
+static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, 
int dir)
 {
struct sadb_msg *hdr;
struct sadb_address *addr;
@@ -2014,6 +2056,7 @@ #endif
struct sadb_x_ipsecrequest *rq;
struct xfrm_tmpl *t = xp->xfrm_vec + i;
int req_size;
+   int mode;
 
 

Re: [PATCH] KEY: Fix conversion between IPSEC_MODE_xxx and XFRM_MODE_xxx.

2007-04-17 Thread David Miller
From: YOSHIFUJI Hideaki / 吉藤英明 <[EMAIL PROTECTED]>
Date: Tue, 17 Apr 2007 17:15:17 +0900 (JST)

> From: Kazunori MIYAZAWA <[EMAIL PROTECTED]>
> Subject: [PATCH] KEY: Fix conversion between IPSEC_MODE_xxx and XFRM_MODE_xxx.
> 
> We should not blindly convert between IPSEC_MODE_xxx and XFRM_MODE_xxx just
> by incrementing / decrementing because the assumption is not true any longer.
> 
> Signed-off-by: Kazunori MIYAZAWA <[EMAIL PROTECTED]>
> Singed-off-by: YOSHIFUJI Hideaki <[EMAIL PROTECTED]>

Patch applied, thank you.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html