diff options
Diffstat (limited to 'testing/linux-grsec/0003-xfrm-SA-lookups-with-mark.patch')
-rw-r--r-- | testing/linux-grsec/0003-xfrm-SA-lookups-with-mark.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/testing/linux-grsec/0003-xfrm-SA-lookups-with-mark.patch b/testing/linux-grsec/0003-xfrm-SA-lookups-with-mark.patch new file mode 100644 index 000000000..e3bf90bf9 --- /dev/null +++ b/testing/linux-grsec/0003-xfrm-SA-lookups-with-mark.patch @@ -0,0 +1,100 @@ +From 7940065d02766d7732a7cda5c2c889beb21ca089 Mon Sep 17 00:00:00 2001 +From: Jamal Hadi Salim <hadi@cyberus.ca> +Date: Mon, 22 Feb 2010 11:32:56 +0000 +Subject: [PATCH 3/7] xfrm: SA lookups with mark + +Allow mark to be added to the SA lookup + +Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + net/xfrm/xfrm_state.c | 12 ++++++++++++ + 1 files changed, 12 insertions(+), 0 deletions(-) + +diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c +index ff7d83e..56abfd5 100644 +--- a/net/xfrm/xfrm_state.c ++++ b/net/xfrm/xfrm_state.c +@@ -672,6 +672,8 @@ static struct xfrm_state *__xfrm_state_lookup(struct net *net, u32 mark, xfrm_ad + xfrm_addr_cmp(&x->id.daddr, daddr, family)) + continue; + ++ if ((mark & x->mark.m) != x->mark.v) ++ continue; + xfrm_state_hold(x); + return x; + } +@@ -692,6 +694,8 @@ static struct xfrm_state *__xfrm_state_lookup_byaddr(struct net *net, u32 mark, + xfrm_addr_cmp(&x->props.saddr, saddr, family)) + continue; + ++ if ((mark & x->mark.m) != x->mark.v) ++ continue; + xfrm_state_hold(x); + return x; + } +@@ -784,6 +788,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, + hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) { + if (x->props.family == family && + x->props.reqid == tmpl->reqid && ++ (mark & x->mark.m) == x->mark.v && + !(x->props.flags & XFRM_STATE_WILDRECV) && + xfrm_state_addr_check(x, daddr, saddr, family) && + tmpl->mode == x->props.mode && +@@ -799,6 +804,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, + hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h_wildcard, bydst) { + if (x->props.family == family && + x->props.reqid == tmpl->reqid && ++ (mark & x->mark.m) == x->mark.v && + !(x->props.flags & XFRM_STATE_WILDRECV) && + xfrm_state_addr_check(x, daddr, saddr, family) && + tmpl->mode == x->props.mode && +@@ -883,6 +889,7 @@ xfrm_stateonly_find(struct net *net, u32 mark, + hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) { + if (x->props.family == family && + x->props.reqid == reqid && ++ (mark & x->mark.m) == x->mark.v && + !(x->props.flags & XFRM_STATE_WILDRECV) && + xfrm_state_addr_check(x, daddr, saddr, family) && + mode == x->props.mode && +@@ -945,11 +952,13 @@ static void __xfrm_state_bump_genids(struct xfrm_state *xnew) + struct xfrm_state *x; + struct hlist_node *entry; + unsigned int h; ++ u32 mark = xnew->mark.v & xnew->mark.m; + + h = xfrm_dst_hash(net, &xnew->id.daddr, &xnew->props.saddr, reqid, family); + hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) { + if (x->props.family == family && + x->props.reqid == reqid && ++ (mark & x->mark.m) == x->mark.v && + !xfrm_addr_cmp(&x->id.daddr, &xnew->id.daddr, family) && + !xfrm_addr_cmp(&x->props.saddr, &xnew->props.saddr, family)) + x->genid = xfrm_state_genid; +@@ -971,6 +980,7 @@ static struct xfrm_state *__find_acq_core(struct net *net, struct xfrm_mark *m, + unsigned int h = xfrm_dst_hash(net, daddr, saddr, reqid, family); + struct hlist_node *entry; + struct xfrm_state *x; ++ u32 mark = m->v & m->m; + + hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) { + if (x->props.reqid != reqid || +@@ -979,6 +989,7 @@ static struct xfrm_state *__find_acq_core(struct net *net, struct xfrm_mark *m, + x->km.state != XFRM_STATE_ACQ || + x->id.spi != 0 || + x->id.proto != proto || ++ (mark & x->mark.m) != x->mark.v || + xfrm_addr_cmp(&x->id.daddr, daddr, family) || + xfrm_addr_cmp(&x->props.saddr, saddr, family)) + continue; +@@ -1440,6 +1451,7 @@ static struct xfrm_state *__xfrm_find_acq_byseq(struct net *net, u32 mark, u32 s + + hlist_for_each_entry(x, entry, net->xfrm.state_bydst+i, bydst) { + if (x->km.seq == seq && ++ (mark & x->mark.m) == x->mark.v && + x->km.state == XFRM_STATE_ACQ) { + xfrm_state_hold(x); + return x; +-- +1.6.3.3 + |