We recently added a check to see if nla_nest_start() fails.  There are
two issues with that.  First, if it fails then I don't think we should
call nla_nest_cancel().  Second, it's slightly convoluted but the
current code returns success but we should return -EMSGSIZE instead.

Fixes: a50fe0ffd76f ("lwtunnel: check return value of nla_nest_start")
Signed-off-by: Dan Carpenter <dan.carpen...@oracle.com>

diff --git a/net/core/lwtunnel.c b/net/core/lwtunnel.c
index 5cbed3816229..cfae3d5fe11f 100644
--- a/net/core/lwtunnel.c
+++ b/net/core/lwtunnel.c
@@ -203,7 +203,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb, struct 
lwtunnel_state *lwtstate)
 {
        const struct lwtunnel_encap_ops *ops;
        struct nlattr *nest;
-       int ret = -EINVAL;
+       int ret;
 
        if (!lwtstate)
                return 0;
@@ -212,10 +212,11 @@ int lwtunnel_fill_encap(struct sk_buff *skb, struct 
lwtunnel_state *lwtstate)
            lwtstate->type > LWTUNNEL_ENCAP_MAX)
                return 0;
 
-       ret = -EOPNOTSUPP;
        nest = nla_nest_start(skb, RTA_ENCAP);
        if (!nest)
-               goto nla_put_failure;
+               return -EMSGSIZE;
+
+       ret = -EOPNOTSUPP;
        rcu_read_lock();
        ops = rcu_dereference(lwtun_encaps[lwtstate->type]);
        if (likely(ops && ops->fill_encap))

Reply via email to