iscsi: Use not malloc'ed but fixed size string for initiator address

Using malloc'ed string for string in iSCSI target has caused
scan-build error.

Maximum size of initiator address is already defined to be
MAX_INITIATOR_ADDR, and hence use fixed size string whose size
is MAX_INITIATOR_ADDR + 1 for spdk_iscsi_initiator_mask::mask.

This change will reduce the potential malloc failure.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Ic39e08986c9377800ce58a1cb5b8401c6b71cf96
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/459706
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
Shuhei Matsumoto 2019-06-28 09:24:49 +09:00 committed by Darek Stojaczyk
parent 4a3ad8371c
commit 975e48ae8a
3 changed files with 22 additions and 23 deletions

View File

@ -211,29 +211,31 @@ iscsi_init_grp_add_netmask(struct spdk_iscsi_init_grp *ig, char *mask)
{
struct spdk_iscsi_initiator_netmask *imask;
char *p;
size_t len;
if (ig->nnetmasks >= MAX_NETMASK) {
SPDK_ERRLOG("> MAX_NETMASK(=%d) is not allowed\n", MAX_NETMASK);
return -EPERM;
}
len = strlen(mask);
if (len > MAX_INITIATOR_ADDR) {
SPDK_ERRLOG("Initiator Name is larger than %d bytes\n", MAX_INITIATOR_ADDR);
return -EINVAL;
}
imask = iscsi_init_grp_find_netmask(ig, mask);
if (imask != NULL) {
return -EEXIST;
}
imask = malloc(sizeof(*imask));
imask = calloc(1, sizeof(*imask));
if (imask == NULL) {
SPDK_ERRLOG("malloc() failed for inititator mask str\n");
return -ENOMEM;
}
imask->mask = strdup(mask);
if (imask->mask == NULL) {
SPDK_ERRLOG("strdup() failed for initiator mask\n");
free(imask);
return -ENOMEM;
}
memcpy(imask->mask, mask, len);
/* Replace "ALL" by "ANY" if set */
p = strstr(imask->mask, "ALL");
@ -262,7 +264,6 @@ iscsi_init_grp_delete_netmask(struct spdk_iscsi_init_grp *ig, char *mask)
TAILQ_REMOVE(&ig->netmask_head, imask, tailq);
ig->nnetmasks--;
free(imask->mask);
free(imask);
return 0;
}
@ -296,7 +297,6 @@ iscsi_init_grp_delete_all_netmasks(struct spdk_iscsi_init_grp *ig)
TAILQ_FOREACH_SAFE(imask, &ig->netmask_head, tailq, tmp) {
TAILQ_REMOVE(&ig->netmask_head, imask, tailq);
ig->nnetmasks--;
free(imask->mask);
free(imask);
}
}

View File

@ -37,6 +37,7 @@
#include "spdk/conf.h"
#include "iscsi/iscsi.h"
#include "iscsi/conn.h"
struct spdk_iscsi_initiator_name {
char name[MAX_INITIATOR_NAME + 1];
@ -44,7 +45,7 @@ struct spdk_iscsi_initiator_name {
};
struct spdk_iscsi_initiator_netmask {
char *mask;
char mask[MAX_INITIATOR_ADDR + 1];
TAILQ_ENTRY(spdk_iscsi_initiator_netmask) tailq;
};

View File

@ -370,7 +370,7 @@ node_access_allowed(void)
TAILQ_INSERT_TAIL(&ig.initiator_head, &iname, tailq);
ig.nnetmasks = 1;
imask.mask = "192.168.2.0/24";
snprintf(imask.mask, sizeof(imask.mask), "192.168.2.0/24");
TAILQ_INIT(&ig.netmask_head);
TAILQ_INSERT_TAIL(&ig.netmask_head, &imask, tailq);
@ -483,7 +483,7 @@ node_access_multi_initiator_groups_cases(void)
struct spdk_iscsi_portal portal;
struct spdk_iscsi_init_grp ig1, ig2;
struct spdk_iscsi_initiator_name iname1 = {}, iname2 = {};
struct spdk_iscsi_initiator_netmask imask1, imask2;
struct spdk_iscsi_initiator_netmask imask1 = {}, imask2 = {};
struct spdk_scsi_dev scsi_dev;
struct spdk_iscsi_pg_map *pg_map;
char *iqn, *addr;
@ -508,7 +508,6 @@ node_access_multi_initiator_groups_cases(void)
TAILQ_INSERT_TAIL(&ig1.initiator_head, &iname1, tailq);
ig1.nnetmasks = 1;
imask1.mask = NULL;
TAILQ_INSERT_TAIL(&ig1.netmask_head, &imask1, tailq);
memset(&ig2, 0, sizeof(struct spdk_iscsi_init_grp));
@ -520,7 +519,6 @@ node_access_multi_initiator_groups_cases(void)
TAILQ_INSERT_TAIL(&ig2.initiator_head, &iname2, tailq);
ig2.nnetmasks = 1;
imask2.mask = NULL;
TAILQ_INSERT_TAIL(&ig2.netmask_head, &imask2, tailq);
/* portal group initialization */
@ -572,7 +570,7 @@ node_access_multi_initiator_groups_cases(void)
* +-------------------------------------------+---------+
*/
snprintf(iname1.name, sizeof(iname1.name), IQN1);
imask1.mask = IP1;
snprintf(imask1.mask, sizeof(imask1.mask), IP1);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
CU_ASSERT(result == true);
@ -589,7 +587,7 @@ node_access_multi_initiator_groups_cases(void)
* +-------------------------------------------+---------+
*/
snprintf(iname1.name, sizeof(iname1.name), IQN1);
imask1.mask = IP2;
snprintf(imask1.mask, sizeof(imask1.mask), IP2);
snprintf(iname2.name, sizeof(iname2.name), NO_IQN1);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
@ -607,9 +605,9 @@ node_access_multi_initiator_groups_cases(void)
* +-------------------------------------------+---------+
*/
snprintf(iname1.name, sizeof(iname1.name), IQN1);
imask1.mask = IP2;
snprintf(imask1.mask, sizeof(imask1.mask), IP2);
snprintf(iname2.name, sizeof(iname2.name), IQN1);
imask2.mask = IP1;
snprintf(imask2.mask, sizeof(imask2.mask), IP1);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
CU_ASSERT(result == true);
@ -626,9 +624,9 @@ node_access_multi_initiator_groups_cases(void)
* +---------------------------------------------+---------+
*/
snprintf(iname1.name, sizeof(iname1.name), IQN1);
imask1.mask = IP2;
snprintf(imask1.mask, sizeof(imask1.mask), IP2);
snprintf(iname2.name, sizeof(iname2.name), IQN1);
imask2.mask = IP2;
snprintf(imask2.mask, sizeof(imask2.mask), IP2);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
CU_ASSERT(result == false);
@ -645,7 +643,7 @@ node_access_multi_initiator_groups_cases(void)
* +---------------------------------------------+---------+
*/
snprintf(iname1.name, sizeof(iname1.name), IQN1);
imask1.mask = IP2;
snprintf(imask1.mask, sizeof(imask1.mask), IP2);
snprintf(iname2.name, sizeof(iname2.name), IQN2);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
@ -681,7 +679,7 @@ node_access_multi_initiator_groups_cases(void)
*/
snprintf(iname1.name, sizeof(iname1.name), IQN2);
snprintf(iname2.name, sizeof(iname2.name), IQN1);
imask2.mask = IP1;
snprintf(imask2.mask, sizeof(imask2.mask), IP1);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
CU_ASSERT(result == true);
@ -699,7 +697,7 @@ node_access_multi_initiator_groups_cases(void)
*/
snprintf(iname1.name, sizeof(iname1.name), IQN2);
snprintf(iname2.name, sizeof(iname2.name), IQN1);
imask2.mask = IP2;
snprintf(imask2.mask, sizeof(imask2.mask), IP2);
result = spdk_iscsi_tgt_node_access(&conn, &tgtnode, iqn, addr);
CU_ASSERT(result == false);