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:
Brian Behlendorf 2019-12-16 15:49:28 -08:00
parent 070402f112
commit 1e49b288cb
1 changed files with 42 additions and 44 deletions

View File

@ -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);
} }