diff options
author | Jesper Juhl <jj@chaosbits.net> | 2011-06-27 18:30:17 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-07-22 05:37:46 -0400 |
commit | a57b5d36453cc9335f75ae191ffd682a250d08ba (patch) | |
tree | 4879b45aec4865ee6c7df64cf7a71b56f75e9238 /drivers/target | |
parent | 824cc5ff37a0dc3ec8c9e7002e3b1ca0b408917e (diff) |
loopback: Fix memory leak in tcm_loop_make_scsi_hba()
There is a memory leak in tcm_loop_make_scsi_hba().
If all the strstr() calls return NULL and we end up at return ERR_PTR(-EINVAL);
then we'll be leaking the memory previously allocated to tl_hba as
that variable goes out of scope.
This patch should fix the leak.
Signed-off-by: Jesper Juhl <jj@chaosbits.net>
Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/loopback/tcm_loop.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index e53cec64ddd4..fe11a336b598 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c | |||
@@ -1288,22 +1288,21 @@ struct se_wwn *tcm_loop_make_scsi_hba( | |||
1288 | goto check_len; | 1288 | goto check_len; |
1289 | } | 1289 | } |
1290 | ptr = strstr(name, "iqn."); | 1290 | ptr = strstr(name, "iqn."); |
1291 | if (ptr) { | 1291 | if (!ptr) { |
1292 | tl_hba->tl_proto_id = SCSI_PROTOCOL_ISCSI; | 1292 | printk(KERN_ERR "Unable to locate prefix for emulated Target " |
1293 | goto check_len; | 1293 | "Port: %s\n", name); |
1294 | ret = -EINVAL; | ||
1295 | goto out; | ||
1294 | } | 1296 | } |
1295 | 1297 | tl_hba->tl_proto_id = SCSI_PROTOCOL_ISCSI; | |
1296 | printk(KERN_ERR "Unable to locate prefix for emulated Target Port:" | ||
1297 | " %s\n", name); | ||
1298 | return ERR_PTR(-EINVAL); | ||
1299 | 1298 | ||
1300 | check_len: | 1299 | check_len: |
1301 | if (strlen(name) >= TL_WWN_ADDR_LEN) { | 1300 | if (strlen(name) >= TL_WWN_ADDR_LEN) { |
1302 | printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds" | 1301 | printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds" |
1303 | " max: %d\n", name, tcm_loop_dump_proto_id(tl_hba), | 1302 | " max: %d\n", name, tcm_loop_dump_proto_id(tl_hba), |
1304 | TL_WWN_ADDR_LEN); | 1303 | TL_WWN_ADDR_LEN); |
1305 | kfree(tl_hba); | 1304 | ret = -EINVAL; |
1306 | return ERR_PTR(-EINVAL); | 1305 | goto out; |
1307 | } | 1306 | } |
1308 | snprintf(&tl_hba->tl_wwn_address[0], TL_WWN_ADDR_LEN, "%s", &name[off]); | 1307 | snprintf(&tl_hba->tl_wwn_address[0], TL_WWN_ADDR_LEN, "%s", &name[off]); |
1309 | 1308 | ||