Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/shaggy...
[pandora-kernel.git] / net / key / af_key.c
index 878039b..76dcd88 100644 (file)
@@ -2784,12 +2784,22 @@ static struct sadb_msg *pfkey_get_base_msg(struct sk_buff *skb, int *errp)
 
 static inline int aalg_tmpl_set(struct xfrm_tmpl *t, struct xfrm_algo_desc *d)
 {
-       return t->aalgos & (1 << d->desc.sadb_alg_id);
+       unsigned int id = d->desc.sadb_alg_id;
+
+       if (id >= sizeof(t->aalgos) * 8)
+               return 0;
+
+       return (t->aalgos >> id) & 1;
 }
 
 static inline int ealg_tmpl_set(struct xfrm_tmpl *t, struct xfrm_algo_desc *d)
 {
-       return t->ealgos & (1 << d->desc.sadb_alg_id);
+       unsigned int id = d->desc.sadb_alg_id;
+
+       if (id >= sizeof(t->ealgos) * 8)
+               return 0;
+
+       return (t->ealgos >> id) & 1;
 }
 
 static int count_ah_combs(struct xfrm_tmpl *t)
@@ -3583,27 +3593,29 @@ static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
                /* old ipsecrequest */
                int mode = pfkey_mode_from_xfrm(mp->mode);
                if (mode < 0)
-                       return -EINVAL;
+                       goto err;
                if (set_ipsecrequest(skb, mp->proto, mode,
                                     (mp->reqid ?  IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE),
                                     mp->reqid, mp->old_family,
-                                    &mp->old_saddr, &mp->old_daddr) < 0) {
-                       return -EINVAL;
-               }
+                                    &mp->old_saddr, &mp->old_daddr) < 0)
+                       goto err;
 
                /* new ipsecrequest */
                if (set_ipsecrequest(skb, mp->proto, mode,
                                     (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE),
                                     mp->reqid, mp->new_family,
-                                    &mp->new_saddr, &mp->new_daddr) < 0) {
-                       return -EINVAL;
-               }
+                                    &mp->new_saddr, &mp->new_daddr) < 0)
+                       goto err;
        }
 
        /* broadcast migrate message to sockets */
        pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL);
 
        return 0;
+
+err:
+       kfree_skb(skb);
+       return -EINVAL;
 }
 #else
 static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type,