summaryrefslogtreecommitdiff
path: root/usr
diff options
context:
space:
mode:
authorWenchao Hao <haowenchao@huawei.com>2020-12-29 20:30:25 +0800
committerWenchao Hao <haowenchao@huawei.com>2020-12-30 09:25:30 +0800
commitb24f8ff48e2285e42d151f73e464531c49a9509e (patch)
treee8fd31ff09488a5d7390cb62164e33be997b08d0 /usr
parente73749f34fdbf6862f43939fb958fca0ba4caadb (diff)
downloadopen-iscsi-b24f8ff48e2285e42d151f73e464531c49a9509e.tar.gz
iscsiadm: Fix memory leak in iscsiadm
Memory allocated by iscsi_context_new() would not be freed if error occurred during parameters parser stage and goto free_ifaces is used to jump to resource clean. Since all resource clean is performed after verified, so change all goto free_ifaces to goto out where handles resource better. Signed-off-by: Wenchao Hao <haowenchao@huawei.com>
Diffstat (limited to 'usr')
-rw-r--r--usr/iscsiadm.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index ea1643b..3987168 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -3627,7 +3627,7 @@ main(int argc, char **argv)
"Priority must be greater than or "
"equal to zero.", killiscsid);
rc = ISCSI_ERR_INVAL;
- goto free_ifaces;
+ goto out;
}
break;
case 't':
@@ -3639,7 +3639,7 @@ main(int argc, char **argv)
log_error("can not recognize operation: '%s'",
optarg);
rc = ISCSI_ERR_INVAL;
- goto free_ifaces;
+ goto out;
}
break;
case 'n':
@@ -3651,7 +3651,7 @@ main(int argc, char **argv)
case 'H':
host_no = parse_host_info(optarg, &rc);
if (rc)
- goto free_ifaces;
+ goto out;
break;
case 'r':
sid = iscsi_sysfs_get_sid_from_path(optarg);
@@ -3659,7 +3659,7 @@ main(int argc, char **argv)
log_error("invalid sid '%s'",
optarg);
rc = ISCSI_ERR_INVAL;
- goto free_ifaces;
+ goto out;
}
break;
case 'R':
@@ -3710,7 +3710,7 @@ main(int argc, char **argv)
mode = str_to_mode(optarg);
rc = verify_mode_params(argc, argv, mode);
if (ISCSI_SUCCESS != rc)
- goto free_ifaces;
+ goto out;
break;
case 'C':
sub_mode = str_to_submode(optarg);
@@ -3739,11 +3739,11 @@ main(int argc, char **argv)
printf("Invalid iface name %s. Must be from "
"1 to %d characters.\n",
optarg, ISCSI_MAX_IFACE_LEN - 1);
- goto free_ifaces;
+ goto out;
} else if (!iface || rc) {
printf("Could not add iface %s.", optarg);
rc = ISCSI_ERR_INVAL;
- goto free_ifaces;
+ goto out;
}
list_add_tail(&iface->list, &ifaces);
@@ -3760,7 +3760,7 @@ main(int argc, char **argv)
log_error("Invalid index %s. %s.",
optarg, strerror(errno));
rc = ISCSI_ERR_INVAL;
- goto free_ifaces;
+ goto out;
}
break;
case 'A':
@@ -3778,7 +3778,7 @@ main(int argc, char **argv)
if (!param) {
log_error("Cannot allocate memory for params.");
rc = ISCSI_ERR_NOMEM;
- goto free_ifaces;
+ goto out;
}
list_add_tail(&param->list, &params);
name = NULL;
@@ -3789,12 +3789,12 @@ main(int argc, char **argv)
if (optopt) {
log_error("unrecognized character '%c'", optopt);
rc = ISCSI_ERR_INVAL;
- goto free_ifaces;
+ goto out;
}
if (killiscsid >= 0) {
kill_iscsid(killiscsid, timeout);
- goto free_ifaces;
+ goto out;
}
if (mode < 0)
@@ -3802,14 +3802,14 @@ main(int argc, char **argv)
if (mode == MODE_FW) {
rc = exec_fw_op(NULL, NULL, info_level, do_login, op);
- goto free_ifaces;
+ goto out;
}
increase_max_files();
if (idbm_init(get_config_file)) {
log_warning("exiting due to idbm configuration error");
rc = ISCSI_ERR_IDBM;
- goto free_ifaces;
+ goto out;
}
switch (mode) {
@@ -4070,7 +4070,6 @@ out:
free(rec);
iscsi_sessions_free(ses, se_count);
idbm_terminate();
-free_ifaces:
list_for_each_entry_safe(iface, tmp, &ifaces, list) {
list_del(&iface->list);
free(iface);