nvmf: Fix the bug when free listen_addrs.

it will free invalid address when we start nvmf using profile,
this patch fix the bug.

Change-Id: I5100eadc2fd129a5b9e3588decac1429d03d78a4
Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
This commit is contained in:
Cunyin Chang 2017-03-09 20:57:53 +08:00 committed by cunyinch
parent c90f57f99f
commit aa2de5c6f6

View File

@ -337,6 +337,7 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
int lcore;
int num_listen_addrs;
struct rpc_listen_address listen_addrs[MAX_LISTEN_ADDRESSES];
char *listen_addrs_str[MAX_LISTEN_ADDRESSES] = {};
int num_hosts;
char *hosts[MAX_HOSTS];
const char *bdf;
@ -351,23 +352,25 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
/* Parse Listen sections */
num_listen_addrs = 0;
for (i = 0; i < MAX_LISTEN_ADDRESSES; i++) {
char *listen_addr;
listen_addrs[num_listen_addrs].transport =
spdk_conf_section_get_nmval(sp, "Listen", i, 0);
listen_addr = spdk_conf_section_get_nmval(sp, "Listen", i, 1);
if (!listen_addrs[num_listen_addrs].transport || !listen_addr) {
if (!listen_addrs[num_listen_addrs].transport) {
break;
}
listen_addr = strdup(listen_addr);
listen_addrs_str[i] = spdk_conf_section_get_nmval(sp, "Listen", i, 1);
if (!listen_addrs_str[i]) {
break;
}
ret = spdk_parse_ip_addr(listen_addr, &listen_addrs[num_listen_addrs].traddr,
listen_addrs_str[i] = strdup(listen_addrs_str[i]);
ret = spdk_parse_ip_addr(listen_addrs_str[i], &listen_addrs[num_listen_addrs].traddr,
&listen_addrs[num_listen_addrs].trsvcid);
if (ret < 0) {
SPDK_ERRLOG("Unable to parse listen address '%s'\n", listen_addr);
free(listen_addr);
SPDK_ERRLOG("Unable to parse listen address '%s'\n", listen_addrs_str[i]);
free(listen_addrs_str[i]);
listen_addrs_str[i] = NULL;
continue;
}
@ -402,9 +405,8 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
bdf, sn,
num_devs, devs);
for (i = 0; i < num_listen_addrs; i++) {
free(listen_addrs[i].traddr);
free(listen_addrs[i].trsvcid);
for (i = 0; i < MAX_LISTEN_ADDRESSES; i++) {
free(listen_addrs_str[i]);
}
return ret;