hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/key/af_key.c
....@@ -1852,9 +1852,9 @@
18521852 if (ext_hdrs[SADB_X_EXT_FILTER - 1]) {
18531853 struct sadb_x_filter *xfilter = ext_hdrs[SADB_X_EXT_FILTER - 1];
18541854
1855
- if ((xfilter->sadb_x_filter_splen >=
1855
+ if ((xfilter->sadb_x_filter_splen >
18561856 (sizeof(xfrm_address_t) << 3)) ||
1857
- (xfilter->sadb_x_filter_dplen >=
1857
+ (xfilter->sadb_x_filter_dplen >
18581858 (sizeof(xfrm_address_t) << 3))) {
18591859 mutex_unlock(&pfk->dump_lock);
18601860 return -EINVAL;
....@@ -1944,7 +1944,8 @@
19441944 }
19451945
19461946 static int
1947
-parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
1947
+parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_policy *pol,
1948
+ struct sadb_x_ipsecrequest *rq)
19481949 {
19491950 struct net *net = xp_net(xp);
19501951 struct xfrm_tmpl *t = xp->xfrm_vec + xp->xfrm_nr;
....@@ -1962,9 +1963,12 @@
19621963 if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0)
19631964 return -EINVAL;
19641965 t->mode = mode;
1965
- if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE)
1966
+ if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE) {
1967
+ if ((mode == XFRM_MODE_TUNNEL || mode == XFRM_MODE_BEET) &&
1968
+ pol->sadb_x_policy_dir == IPSEC_DIR_OUTBOUND)
1969
+ return -EINVAL;
19661970 t->optional = 1;
1967
- else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
1971
+ } else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
19681972 t->reqid = rq->sadb_x_ipsecrequest_reqid;
19691973 if (t->reqid > IPSEC_MANUAL_REQID_MAX)
19701974 t->reqid = 0;
....@@ -2006,7 +2010,7 @@
20062010 rq->sadb_x_ipsecrequest_len < sizeof(*rq))
20072011 return -EINVAL;
20082012
2009
- if ((err = parse_ipsecrequest(xp, rq)) < 0)
2013
+ if ((err = parse_ipsecrequest(xp, pol, rq)) < 0)
20102014 return err;
20112015 len -= rq->sadb_x_ipsecrequest_len;
20122016 rq = (void*)((u8*)rq + rq->sadb_x_ipsecrequest_len);