ipv6: fib6_rule_action_alt needs to return -EAGAIN
authorDavid Ahern <dsahern@gmail.com>
Wed, 24 Apr 2019 01:06:30 +0000 (18:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2019 04:52:33 +0000 (21:52 -0700)
fib rule actions should return -EAGAIN for the rules to continue to the
next one. A recent change overwrote err with the lookup always returning
0 (future change will make it more like IPv4) which means the rules
stopped at the first (e.g., local table lookup only). Catch and reset err
to -EAGAIN.

Fixes: effda4dd97e87 ("ipv6: Pass fib6_result to fib lookups")
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/fib6_rules.c

index ab5ac643bae8e6bca19f145d91c5576b073b6326..dbedbe655c91d4d8e8b9c188b83279fa5b0785ff 100644 (file)
@@ -157,7 +157,7 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp,
        struct flowi6 *flp6 = &flp->u.ip6;
        struct net *net = rule->fr_net;
        struct fib6_table *table;
-       int err = -EAGAIN, *oif;
+       int err, *oif;
        u32 tb_id;
 
        switch (rule->action) {
@@ -182,6 +182,8 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp,
        if (!err && res->f6i != net->ipv6.fib6_null_entry)
                err = fib6_rule_saddr(net, rule, flags, flp6,
                                      res->nh->fib_nh_dev);
+       else
+               err = -EAGAIN;
 
        return err;
 }