From 7ce3f66c1a1a563de01c3dd5c22a3bd2972ad952 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Fri, 15 Mar 2013 01:24:18 +0000 Subject: [PATCH] scst_sysfs: Fix memory leaks in ALUA error paths Signed-off-by: Bart Van Assche git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@4797 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/scst_sysfs.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/scst/src/scst_sysfs.c b/scst/src/scst_sysfs.c index 30ad1b569..1326ea4c0 100644 --- a/scst/src/scst_sysfs.c +++ b/scst/src/scst_sysfs.c @@ -4906,14 +4906,16 @@ static ssize_t scst_dg_devs_mgmt_store(struct kobject *kobj, if (res) goto out; - work->buf = cmd; + swap(work->buf, cmd); work->kobj = kobj; kobject_get(kobj); res = scst_sysfs_queue_wait_work(work); + if (res) + goto out; + res = count; out: - if (res == 0) - res = count; + kfree(cmd); TRACE_EXIT_RES(res); return res; } @@ -5187,14 +5189,16 @@ static ssize_t scst_tg_state_store(struct kobject *kobj, if (res) goto out; - work->buf = cmd; + swap(work->buf, cmd); work->kobj = kobj; kobject_get(kobj); res = scst_sysfs_queue_wait_work(work); + if (res) + goto out; + res = count; out: - if (res == 0) - res = count; + kfree(cmd); TRACE_EXIT_RES(res); return res; } @@ -5269,14 +5273,16 @@ static ssize_t scst_tg_mgmt_store(struct kobject *kobj, if (res) goto out; - work->buf = cmd; + swap(work->buf, cmd); work->kobj = kobj; kobject_get(kobj); res = scst_sysfs_queue_wait_work(work); + if (res) + goto out; + res = count; out: - if (res == 0) - res = count; + kfree(cmd); TRACE_EXIT_RES(res); return res; } @@ -5390,14 +5396,16 @@ static ssize_t scst_dg_tgs_mgmt_store(struct kobject *kobj, if (res) goto out; - work->buf = cmd; + swap(work->buf, cmd); work->kobj = kobj; kobject_get(kobj); res = scst_sysfs_queue_wait_work(work); + if (res) + goto out; + res = count; out: - if (res == 0) - res = count; + kfree(cmd); TRACE_EXIT_RES(res); return res; }