IMHO it is possible that failure will be treated as success because we don't

initialize nvp on every loop iteration and the code under 'fail'(!) label
detects success by checking of nvp != NULL.

Submitted by:	pjd@
MFC after:	1 month
Sponsored by:   Wheel Systems
This commit is contained in:
oshogbo 2017-09-21 10:16:44 +00:00
parent 14c708eabc
commit 5b3c574401

View File

@ -1690,11 +1690,10 @@ nvpair_move_number_array(const char *name, uint64_t *value, size_t nitems)
nvpair_t *
nvpair_move_nvlist_array(const char *name, nvlist_t **value, size_t nitems)
{
nvpair_t *parent;
unsigned int ii;
nvpair_t *nvp;
int flags;
nvp = NULL;
if (value == NULL || nitems == 0) {
ERRNO_SET(EINVAL);
return (NULL);
@ -1707,6 +1706,8 @@ nvpair_move_nvlist_array(const char *name, nvlist_t **value, size_t nitems)
goto fail;
}
if (ii > 0) {
nvpair_t *nvp;
nvp = nvpair_allocv(" ", NV_TYPE_NVLIST,
(uint64_t)(uintptr_t)value[ii], 0, 0);
if (nvp == NULL)
@ -1717,25 +1718,27 @@ nvpair_move_nvlist_array(const char *name, nvlist_t **value, size_t nitems)
flags = nvlist_flags(value[nitems - 1]) | NV_FLAG_IN_ARRAY;
nvlist_set_flags(value[nitems - 1], flags);
nvp = nvpair_allocv(name, NV_TYPE_NVLIST_ARRAY,
parent = nvpair_allocv(name, NV_TYPE_NVLIST_ARRAY,
(uint64_t)(uintptr_t)value, 0, nitems);
fail:
if (nvp == NULL) {
ERRNO_SAVE();
for (ii = 0; ii < nitems; ii++) {
if (value[ii] != NULL &&
nvlist_get_pararr(value[ii], NULL) != NULL) {
nvlist_destroy(value[ii]);
}
}
nv_free(value);
ERRNO_RESTORE();
} else {
for (ii = 0; ii < nitems; ii++)
nvlist_set_parent(value[ii], nvp);
}
if (parent == NULL)
goto fail;
return (nvp);
for (ii = 0; ii < nitems; ii++)
nvlist_set_parent(value[ii], parent);
return (parent);
fail:
ERRNO_SAVE();
for (ii = 0; ii < nitems; ii++) {
if (value[ii] != NULL &&
nvlist_get_pararr(value[ii], NULL) != NULL) {
nvlist_destroy(value[ii]);
}
}
nv_free(value);
ERRNO_RESTORE();
return (NULL);
}
#ifndef _KERNEL