]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
qdisc: fix a module refcount leak in qdisc_create_dflt()
authorEric Dumazet <edumazet@google.com>
Wed, 24 Aug 2016 16:39:02 +0000 (09:39 -0700)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 20 Nov 2016 01:17:17 +0000 (01:17 +0000)
commit 166ee5b87866de07a3e56c1b757f2b5cabba72a5 upstream.

Should qdisc_alloc() fail, we must release the module refcount
we got right before.

Fixes: 6da7c8fcbcbd ("qdisc: allow setting default queuing discipline")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
net/sched/sch_generic.c

index e1543b03e39d10c9b952a7ccf454cbd76dd09f09..c0bdd3bce189d0a80a04d572a14d721961193ae0 100644 (file)
@@ -590,18 +590,19 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
        struct Qdisc *sch;
 
        if (!try_module_get(ops->owner))
-               goto errout;
+               return NULL;
 
        sch = qdisc_alloc(dev_queue, ops);
-       if (IS_ERR(sch))
-               goto errout;
+       if (IS_ERR(sch)) {
+               module_put(ops->owner);
+               return NULL;
+       }
        sch->parent = parentid;
 
        if (!ops->init || ops->init(sch, NULL) == 0)
                return sch;
 
        qdisc_destroy(sch);
-errout:
        return NULL;
 }
 EXPORT_SYMBOL(qdisc_create_dflt);