summaryrefslogtreecommitdiffstats
path: root/testing/linux-grsec/0007-xfrm-Allow-user-space-manipulation-of-SPD-mark.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/linux-grsec/0007-xfrm-Allow-user-space-manipulation-of-SPD-mark.patch')
-rw-r--r--testing/linux-grsec/0007-xfrm-Allow-user-space-manipulation-of-SPD-mark.patch165
1 files changed, 165 insertions, 0 deletions
diff --git a/testing/linux-grsec/0007-xfrm-Allow-user-space-manipulation-of-SPD-mark.patch b/testing/linux-grsec/0007-xfrm-Allow-user-space-manipulation-of-SPD-mark.patch
new file mode 100644
index 00000000..b1cd1a50
--- /dev/null
+++ b/testing/linux-grsec/0007-xfrm-Allow-user-space-manipulation-of-SPD-mark.patch
@@ -0,0 +1,165 @@
+From 40ee52ad2b96e7f5a558fe3aefd71df54411429a Mon Sep 17 00:00:00 2001
+From: Jamal Hadi Salim <hadi@cyberus.ca>
+Date: Mon, 22 Feb 2010 11:33:00 +0000
+Subject: [PATCH 7/7] xfrm: Allow user space manipulation of SPD mark
+
+Add ability for netlink userspace to manipulate the SPD
+and manipulate the mark, retrieve it and get events with a defined
+mark, etc.
+
+Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ net/xfrm/xfrm_user.c | 31 +++++++++++++++++++++++++------
+ 1 files changed, 25 insertions(+), 6 deletions(-)
+
+diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
+index 17252b4..da22919 100644
+--- a/net/xfrm/xfrm_user.c
++++ b/net/xfrm/xfrm_user.c
+@@ -31,8 +31,6 @@
+ #include <linux/in6.h>
+ #endif
+
+-#define DUMMY_MARK 0
+-
+ static inline int aead_len(struct xfrm_algo_aead *alg)
+ {
+ return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
+@@ -1122,6 +1120,8 @@ static struct xfrm_policy *xfrm_policy_construct(struct net *net, struct xfrm_us
+ if (err)
+ goto error;
+
++ xfrm_mark_get(attrs, &xp->mark);
++
+ return xp;
+ error:
+ *errp = err;
+@@ -1268,10 +1268,13 @@ static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr
+ goto nlmsg_failure;
+ if (copy_to_user_policy_type(xp->type, skb) < 0)
+ goto nlmsg_failure;
++ if (xfrm_mark_put(skb, &xp->mark))
++ goto nla_put_failure;
+
+ nlmsg_end(skb, nlh);
+ return 0;
+
++nla_put_failure:
+ nlmsg_failure:
+ nlmsg_cancel(skb, nlh);
+ return -EMSGSIZE;
+@@ -1343,6 +1346,8 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
+ int err;
+ struct km_event c;
+ int delete;
++ struct xfrm_mark m;
++ u32 mark = xfrm_mark_get(attrs, &m);
+
+ p = nlmsg_data(nlh);
+ delete = nlh->nlmsg_type == XFRM_MSG_DELPOLICY;
+@@ -1356,7 +1361,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
+ return err;
+
+ if (p->index)
+- xp = xfrm_policy_byid(net, DUMMY_MARK, type, p->dir, p->index, delete, &err);
++ xp = xfrm_policy_byid(net, mark, type, p->dir, p->index, delete, &err);
+ else {
+ struct nlattr *rt = attrs[XFRMA_SEC_CTX];
+ struct xfrm_sec_ctx *ctx;
+@@ -1373,7 +1378,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
+ if (err)
+ return err;
+ }
+- xp = xfrm_policy_bysel_ctx(net, DUMMY_MARK, type, p->dir, &p->sel,
++ xp = xfrm_policy_bysel_ctx(net, mark, type, p->dir, &p->sel,
+ ctx, delete, &err);
+ security_xfrm_policy_free(ctx);
+ }
+@@ -1610,13 +1615,15 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
+ struct xfrm_userpolicy_info *p = &up->pol;
+ u8 type = XFRM_POLICY_TYPE_MAIN;
+ int err = -ENOENT;
++ struct xfrm_mark m;
++ u32 mark = xfrm_mark_get(attrs, &m);
+
+ err = copy_from_user_policy_type(&type, attrs);
+ if (err)
+ return err;
+
+ if (p->index)
+- xp = xfrm_policy_byid(net, DUMMY_MARK, type, p->dir, p->index, 0, &err);
++ xp = xfrm_policy_byid(net, mark, type, p->dir, p->index, 0, &err);
+ else {
+ struct nlattr *rt = attrs[XFRMA_SEC_CTX];
+ struct xfrm_sec_ctx *ctx;
+@@ -1633,7 +1640,7 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
+ if (err)
+ return err;
+ }
+- xp = xfrm_policy_bysel_ctx(net, DUMMY_MARK, type, p->dir,
++ xp = xfrm_policy_bysel_ctx(net, mark, type, p->dir,
+ &p->sel, ctx, 0, &err);
+ security_xfrm_policy_free(ctx);
+ }
+@@ -2298,9 +2305,12 @@ static int build_acquire(struct sk_buff *skb, struct xfrm_state *x,
+ goto nlmsg_failure;
+ if (copy_to_user_policy_type(xp->type, skb) < 0)
+ goto nlmsg_failure;
++ if (xfrm_mark_put(skb, &xp->mark))
++ goto nla_put_failure;
+
+ return nlmsg_end(skb, nlh);
+
++nla_put_failure:
+ nlmsg_failure:
+ nlmsg_cancel(skb, nlh);
+ return -EMSGSIZE;
+@@ -2387,6 +2397,7 @@ static inline size_t xfrm_polexpire_msgsize(struct xfrm_policy *xp)
+ return NLMSG_ALIGN(sizeof(struct xfrm_user_polexpire))
+ + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
+ + nla_total_size(xfrm_user_sec_ctx_size(xp->security))
++ + nla_total_size(sizeof(struct xfrm_mark))
+ + userpolicy_type_attrsize();
+ }
+
+@@ -2409,10 +2420,13 @@ static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp,
+ goto nlmsg_failure;
+ if (copy_to_user_policy_type(xp->type, skb) < 0)
+ goto nlmsg_failure;
++ if (xfrm_mark_put(skb, &xp->mark))
++ goto nla_put_failure;
+ upe->hard = !!hard;
+
+ return nlmsg_end(skb, nlh);
+
++nla_put_failure:
+ nlmsg_failure:
+ nlmsg_cancel(skb, nlh);
+ return -EMSGSIZE;
+@@ -2449,6 +2463,7 @@ static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, struct km_event *
+ headlen = sizeof(*id);
+ }
+ len += userpolicy_type_attrsize();
++ len += nla_total_size(sizeof(struct xfrm_mark));
+ len += NLMSG_ALIGN(headlen);
+
+ skb = nlmsg_new(len, GFP_ATOMIC);
+@@ -2484,10 +2499,14 @@ static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, struct km_event *
+ if (copy_to_user_policy_type(xp->type, skb) < 0)
+ goto nlmsg_failure;
+
++ if (xfrm_mark_put(skb, &xp->mark))
++ goto nla_put_failure;
++
+ nlmsg_end(skb, nlh);
+
+ return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_POLICY, GFP_ATOMIC);
+
++nla_put_failure:
+ nlmsg_failure:
+ kfree_skb(skb);
+ return -1;
+--
+1.6.3.3
+