workqueue: fix memory leak in apply_workqueue_attrs()
authorTejun Heo <tj@kernel.org>
Mon, 1 Apr 2013 18:23:31 +0000 (11:23 -0700)
committerTejun Heo <tj@kernel.org>
Mon, 1 Apr 2013 18:23:31 +0000 (11:23 -0700)
apply_workqueue_attrs() wasn't freeing temp attrs variable @new_attrs
in its success path.  Fix it.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Lai Jiangshan <laijs@cn.fujitsu.com>
kernel/workqueue.c

index abe1f0da4600e2f60b37ecb631102ccea098c330..89480fc8eaa3e50cff15f0e20a20bb427908c2ce 100644 (file)
@@ -3636,6 +3636,7 @@ int apply_workqueue_attrs(struct workqueue_struct *wq,
        struct workqueue_attrs *new_attrs;
        struct pool_workqueue *pwq = NULL, *last_pwq;
        struct worker_pool *pool;
+       int ret;
 
        /* only unbound workqueues can change attributes */
        if (WARN_ON(!(wq->flags & WQ_UNBOUND)))
@@ -3668,12 +3669,16 @@ int apply_workqueue_attrs(struct workqueue_struct *wq,
                spin_unlock_irq(&last_pwq->pool->lock);
        }
 
-       return 0;
+       ret = 0;
+       /* fall through */
+out_free:
+       free_workqueue_attrs(new_attrs);
+       return ret;
 
 enomem:
        kmem_cache_free(pwq_cache, pwq);
-       free_workqueue_attrs(new_attrs);
-       return -ENOMEM;
+       ret = -ENOMEM;
+       goto out_free;
 }
 
 static int alloc_and_link_pwqs(struct workqueue_struct *wq)