📄 pfkey_xfrmuser_interfamily.patch
字号:
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.cindex 157bfbd..75fdb7d 100644--- a/net/xfrm/xfrm_policy.c+++ b/net/xfrm/xfrm_policy.c@@ -1299,7 +1299,8 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, struct flowi *fl, xfrm_address_t *local = saddr; struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i]; - if (tmpl->mode == XFRM_MODE_TUNNEL) {+ if (tmpl->mode == XFRM_MODE_TUNNEL ||+ tmpl->mode == XFRM_MODE_BEET) { remote = &tmpl->id.daddr; local = &tmpl->saddr; family = tmpl->encap_family;diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.cindex e070c3f..f5d30c4 100644--- a/net/xfrm/xfrm_state.c+++ b/net/xfrm/xfrm_state.c@@ -611,7 +611,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, selector. */ if (x->km.state == XFRM_STATE_VALID) {- if (!xfrm_selector_match(&x->sel, fl, family) ||+ if (!xfrm_selector_match(&x->sel, fl, x->sel.family) || !security_xfrm_state_pol_flow_match(x, pol, fl)) continue; if (!best ||@@ -623,7 +623,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, acquire_in_progress = 1; } else if (x->km.state == XFRM_STATE_ERROR || x->km.state == XFRM_STATE_EXPIRED) {- if (xfrm_selector_match(&x->sel, fl, family) &&+ if (xfrm_selector_match(&x->sel, fl, x->sel.family) && security_xfrm_state_pol_flow_match(x, pol, fl)) error = -ESRCH; }--- linux-2.6.22.1/net/key/af_key.c 2007-07-10 21:56:30.000000000 +0300+++ linux-2.6.22.1-p/net/key/af_key.c 2007-08-08 08:27:31.000000000 +0300@@ -1205,6 +1205,9 @@ static struct xfrm_state * pfkey_msg2xfr x->sel.family = pfkey_sadb_addr2xfrm_addr(addr, &x->sel.saddr); x->sel.prefixlen_s = addr->sadb_address_prefixlen; }+ + if (!x->sel.family)+ x->sel.family = x->props.family; if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) { struct sadb_x_nat_t_type* n_type;--- linux-2.6.22.1/net/xfrm/xfrm_user.c 2007-07-10 21:56:30.000000000 +0300+++ linux-2.6.22.1-p/net/xfrm/xfrm_user.c 2007-08-08 08:28:12.000000000 +0300@@ -322,6 +322,13 @@ static void copy_from_user_state(struct x->props.family = p->family; memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr)); x->props.flags = p->flags;+ + /*+ * Set inner address family if the KM left it as zero.+ * See comment in validate_tmpl.+ */+ if (!x->sel.family)+ x->sel.family = p->family; } /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -