aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhil Carmody <ext-phil.2.carmody@nokia.com>2009-12-10 07:29:37 -0500
committerIngo Molnar <mingo@elte.hu>2009-12-10 08:28:10 -0500
commitdfc12eb26a285df316be68a808af86964f3bff86 (patch)
tree502e31f805cd335131a52dd202c7c2825cf4006b
parent4ca3ef71f54655af98b66e8ff308a47a2a580a53 (diff)
sched: Fix memory leak in two error corner cases
If the second in each of these pairs of allocations fails, then the first one will not be freed in the error route out. Found by a static code analysis tool. Signed-off-by: Phil Carmody <ext-phil.2.carmody@nokia.com> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <1260448177-28448-1-git-send-email-ext-phil.2.carmody@nokia.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/sched.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 3de3deab8095..36cc05a76947 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -9855,13 +9855,15 @@ int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
9855 se = kzalloc_node(sizeof(struct sched_entity), 9855 se = kzalloc_node(sizeof(struct sched_entity),
9856 GFP_KERNEL, cpu_to_node(i)); 9856 GFP_KERNEL, cpu_to_node(i));
9857 if (!se) 9857 if (!se)
9858 goto err; 9858 goto err_free_rq;
9859 9859
9860 init_tg_cfs_entry(tg, cfs_rq, se, i, 0, parent->se[i]); 9860 init_tg_cfs_entry(tg, cfs_rq, se, i, 0, parent->se[i]);
9861 } 9861 }
9862 9862
9863 return 1; 9863 return 1;
9864 9864
9865 err_free_rq:
9866 kfree(cfs_rq);
9865 err: 9867 err:
9866 return 0; 9868 return 0;
9867} 9869}
@@ -9943,13 +9945,15 @@ int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent)
9943 rt_se = kzalloc_node(sizeof(struct sched_rt_entity), 9945 rt_se = kzalloc_node(sizeof(struct sched_rt_entity),
9944 GFP_KERNEL, cpu_to_node(i)); 9946 GFP_KERNEL, cpu_to_node(i));
9945 if (!rt_se) 9947 if (!rt_se)
9946 goto err; 9948 goto err_free_rq;
9947 9949
9948 init_tg_rt_entry(tg, rt_rq, rt_se, i, 0, parent->rt_se[i]); 9950 init_tg_rt_entry(tg, rt_rq, rt_se, i, 0, parent->rt_se[i]);
9949 } 9951 }
9950 9952
9951 return 1; 9953 return 1;
9952 9954
9955 err_free_rq:
9956 kfree(rt_rq);
9953 err: 9957 err:
9954 return 0; 9958 return 0;
9955} 9959}