|
@@ -1025,10 +1025,12 @@ static inline int xfrm_nlmsg_multicast(struct net *net, struct sk_buff *skb,
|
|
|
{
|
|
|
struct sock *nlsk = rcu_dereference(net->xfrm.nlsk);
|
|
|
|
|
|
- if (nlsk)
|
|
|
- return nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC);
|
|
|
- else
|
|
|
- return -1;
|
|
|
+ if (!nlsk) {
|
|
|
+ kfree_skb(skb);
|
|
|
+ return -EPIPE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC);
|
|
|
}
|
|
|
|
|
|
static inline unsigned int xfrm_spdinfo_msgsize(void)
|
|
@@ -1671,9 +1673,11 @@ static inline unsigned int userpolicy_type_attrsize(void)
|
|
|
#ifdef CONFIG_XFRM_SUB_POLICY
|
|
|
static int copy_to_user_policy_type(u8 type, struct sk_buff *skb)
|
|
|
{
|
|
|
- struct xfrm_userpolicy_type upt = {
|
|
|
- .type = type,
|
|
|
- };
|
|
|
+ struct xfrm_userpolicy_type upt;
|
|
|
+
|
|
|
+ /* Sadly there are two holes in struct xfrm_userpolicy_type */
|
|
|
+ memset(&upt, 0, sizeof(upt));
|
|
|
+ upt.type = type;
|
|
|
|
|
|
return nla_put(skb, XFRMA_POLICY_TYPE, sizeof(upt), &upt);
|
|
|
}
|