cppcheck: (error) Null pointer dereference: who_perm
As indicated by the VERIFY the local who_perm variable can never be NULL in parse_fs_perm(). Due to the existence of the is_set conditional, which is always true, cppcheck 1.88 was reporting a possible NULL reference. Resolve the issue by removing the extraneous is_set variable. Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #9732
This commit is contained in:
parent
070402f112
commit
1e49b288cb
|
@ -5102,7 +5102,6 @@ parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl)
|
||||||
zfs_deleg_who_type_t perm_type = name[0];
|
zfs_deleg_who_type_t perm_type = name[0];
|
||||||
char perm_locality = name[1];
|
char perm_locality = name[1];
|
||||||
const char *perm_name = name + 3;
|
const char *perm_name = name + 3;
|
||||||
boolean_t is_set = B_TRUE;
|
|
||||||
who_perm_t *who_perm = NULL;
|
who_perm_t *who_perm = NULL;
|
||||||
|
|
||||||
assert('$' == name[2]);
|
assert('$' == name[2]);
|
||||||
|
@ -5132,57 +5131,56 @@ parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl)
|
||||||
assert(!"unhandled zfs_deleg_who_type_t");
|
assert(!"unhandled zfs_deleg_who_type_t");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_set) {
|
who_perm_node_t *found_node = NULL;
|
||||||
who_perm_node_t *found_node = NULL;
|
who_perm_node_t *node = safe_malloc(
|
||||||
who_perm_node_t *node = safe_malloc(
|
sizeof (who_perm_node_t));
|
||||||
sizeof (who_perm_node_t));
|
who_perm = &node->who_perm;
|
||||||
who_perm = &node->who_perm;
|
uu_avl_index_t idx = 0;
|
||||||
uu_avl_index_t idx = 0;
|
|
||||||
|
|
||||||
uu_avl_node_init(node, &node->who_avl_node, avl_pool);
|
uu_avl_node_init(node, &node->who_avl_node, avl_pool);
|
||||||
who_perm_init(who_perm, fsperm, perm_type, perm_name);
|
who_perm_init(who_perm, fsperm, perm_type, perm_name);
|
||||||
|
|
||||||
if ((found_node = uu_avl_find(avl, node, NULL, &idx))
|
if ((found_node = uu_avl_find(avl, node, NULL, &idx))
|
||||||
== NULL) {
|
== NULL) {
|
||||||
if (avl == fsperm->fsp_uge_avl) {
|
if (avl == fsperm->fsp_uge_avl) {
|
||||||
uid_t rid = 0;
|
uid_t rid = 0;
|
||||||
struct passwd *p = NULL;
|
struct passwd *p = NULL;
|
||||||
struct group *g = NULL;
|
struct group *g = NULL;
|
||||||
const char *nice_name = NULL;
|
const char *nice_name = NULL;
|
||||||
|
|
||||||
switch (perm_type) {
|
switch (perm_type) {
|
||||||
case ZFS_DELEG_USER_SETS:
|
case ZFS_DELEG_USER_SETS:
|
||||||
case ZFS_DELEG_USER:
|
case ZFS_DELEG_USER:
|
||||||
rid = atoi(perm_name);
|
rid = atoi(perm_name);
|
||||||
p = getpwuid(rid);
|
p = getpwuid(rid);
|
||||||
if (p)
|
if (p)
|
||||||
nice_name = p->pw_name;
|
nice_name = p->pw_name;
|
||||||
break;
|
break;
|
||||||
case ZFS_DELEG_GROUP_SETS:
|
case ZFS_DELEG_GROUP_SETS:
|
||||||
case ZFS_DELEG_GROUP:
|
case ZFS_DELEG_GROUP:
|
||||||
rid = atoi(perm_name);
|
rid = atoi(perm_name);
|
||||||
g = getgrgid(rid);
|
g = getgrgid(rid);
|
||||||
if (g)
|
if (g)
|
||||||
nice_name = g->gr_name;
|
nice_name = g->gr_name;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if (nice_name != NULL)
|
|
||||||
(void) strlcpy(
|
|
||||||
node->who_perm.who_ug_name,
|
|
||||||
nice_name, 256);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uu_avl_insert(avl, node, idx);
|
if (nice_name != NULL)
|
||||||
} else {
|
(void) strlcpy(
|
||||||
node = found_node;
|
node->who_perm.who_ug_name,
|
||||||
who_perm = &node->who_perm;
|
nice_name, 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uu_avl_insert(avl, node, idx);
|
||||||
|
} else {
|
||||||
|
node = found_node;
|
||||||
|
who_perm = &node->who_perm;
|
||||||
}
|
}
|
||||||
VERIFY3P(who_perm, !=, NULL);
|
|
||||||
|
assert(who_perm != NULL);
|
||||||
(void) parse_who_perm(who_perm, nvl2, perm_locality);
|
(void) parse_who_perm(who_perm, nvl2, perm_locality);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue