diff options
Diffstat (limited to 'net/xfrm/xfrm_policy.c')
-rw-r--r-- | net/xfrm/xfrm_policy.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 2e10d46c0e8c..a83b5e1349ed 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -1469,11 +1469,13 @@ restart: | |||
1469 | goto dropdst; | 1469 | goto dropdst; |
1470 | } | 1470 | } |
1471 | 1471 | ||
1472 | err = -ENOENT; | ||
1473 | |||
1472 | if (!policy) { | 1474 | if (!policy) { |
1473 | /* To accelerate a bit... */ | 1475 | /* To accelerate a bit... */ |
1474 | if ((dst_orig->flags & DST_NOXFRM) || | 1476 | if ((dst_orig->flags & DST_NOXFRM) || |
1475 | !xfrm_policy_count[XFRM_POLICY_OUT]) | 1477 | !xfrm_policy_count[XFRM_POLICY_OUT]) |
1476 | return 0; | 1478 | goto nopol; |
1477 | 1479 | ||
1478 | policy = flow_cache_lookup(fl, dst_orig->ops->family, | 1480 | policy = flow_cache_lookup(fl, dst_orig->ops->family, |
1479 | dir, xfrm_policy_lookup); | 1481 | dir, xfrm_policy_lookup); |
@@ -1483,14 +1485,18 @@ restart: | |||
1483 | } | 1485 | } |
1484 | 1486 | ||
1485 | if (!policy) | 1487 | if (!policy) |
1486 | return 0; | 1488 | goto nopol; |
1487 | 1489 | ||
1488 | family = dst_orig->ops->family; | 1490 | family = dst_orig->ops->family; |
1489 | policy->curlft.use_time = get_seconds(); | ||
1490 | pols[0] = policy; | 1491 | pols[0] = policy; |
1491 | npols ++; | 1492 | npols ++; |
1492 | xfrm_nr += pols[0]->xfrm_nr; | 1493 | xfrm_nr += pols[0]->xfrm_nr; |
1493 | 1494 | ||
1495 | if ((flags & XFRM_LOOKUP_ICMP) && !(policy->flags & XFRM_POLICY_ICMP)) | ||
1496 | goto error; | ||
1497 | |||
1498 | policy->curlft.use_time = get_seconds(); | ||
1499 | |||
1494 | switch (policy->action) { | 1500 | switch (policy->action) { |
1495 | default: | 1501 | default: |
1496 | case XFRM_POLICY_BLOCK: | 1502 | case XFRM_POLICY_BLOCK: |
@@ -1649,6 +1655,11 @@ dropdst: | |||
1649 | dst_release(dst_orig); | 1655 | dst_release(dst_orig); |
1650 | *dst_p = NULL; | 1656 | *dst_p = NULL; |
1651 | return err; | 1657 | return err; |
1658 | |||
1659 | nopol: | ||
1660 | if (flags & XFRM_LOOKUP_ICMP) | ||
1661 | goto dropdst; | ||
1662 | return 0; | ||
1652 | } | 1663 | } |
1653 | EXPORT_SYMBOL(__xfrm_lookup); | 1664 | EXPORT_SYMBOL(__xfrm_lookup); |
1654 | 1665 | ||