[IPSEC]: Fix zero return value in xfrm_lookup on error
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 13 Dec 2007 17:30:59 +0000 (09:30 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:57:54 +0000 (14:57 -0800)
Further testing shows that my ICMP relookup patch can cause xfrm_lookup
to return zero on error which isn't very nice since it leads to the caller
dying on null pointer dereference.  The bug is due to not setting err
to ENOENT just before we leave xfrm_lookup in case of no policy.

This patch moves the err setting to where it should be.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/xfrm/xfrm_policy.c

index a83b5e1349ed4985c77c8ce361059a01d646f91b..8023a3c0dad5f9b69bd113934a95e5d33759bca3 100644 (file)
@@ -1469,8 +1469,6 @@ restart:
                        goto dropdst;
        }
 
-       err = -ENOENT;
-
        if (!policy) {
                /* To accelerate a bit...  */
                if ((dst_orig->flags & DST_NOXFRM) ||
@@ -1492,6 +1490,7 @@ restart:
        npols ++;
        xfrm_nr += pols[0]->xfrm_nr;
 
+       err = -ENOENT;
        if ((flags & XFRM_LOOKUP_ICMP) && !(policy->flags & XFRM_POLICY_ICMP))
                goto error;
 
@@ -1657,6 +1656,7 @@ dropdst:
        return err;
 
 nopol:
+       err = -ENOENT;
        if (flags & XFRM_LOOKUP_ICMP)
                goto dropdst;
        return 0;