'virTypedParamsGetStringList' fills the returned array only with string
parameters with matching name. The filtering code though leaves the
possibility that all items are filtered out but the return array is
still (over)allocated.
Since 'virTypedParamsFilter()' now also allows filtering by type we can
move the filtering there ensuring that we always allocate the right
number of elements and more importantly the returned array will be NULL
if none elements are present.
Rework the code and adjust docs.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/util/virtypedparam.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
index a080d7ba0f..564cb81acc 100644
--- a/src/util/virtypedparam.c
+++ b/src/util/virtypedparam.c
@@ -439,7 +439,8 @@ virTypedParamsFilter(virTypedParameterPtr params,
* @values: array of returned values
*
* Finds all parameters with desired @name within @params and
- * store their values into @values.
+ * store their values into @values. If none of the @params are strings named
+ * @name the returned @values will be NULL.
*
* Important: The strings in the returned string list @values are borrowed from
* @params and thus caller must free only the pointer returned as @values, but
@@ -454,13 +455,12 @@ virTypedParamsGetStringList(virTypedParameterPtr params,
const char ***values)
{
size_t i;
- size_t n = 0;
size_t nfiltered;
g_autofree virTypedParameterPtr *filtered = NULL;
*values = NULL;
- nfiltered = virTypedParamsFilter(params, nparams, name, 0, &filtered);
+ nfiltered = virTypedParamsFilter(params, nparams, name, VIR_TYPED_PARAM_STRING,
&filtered);
if (nfiltered == 0)
return 0;
@@ -468,11 +468,10 @@ virTypedParamsGetStringList(virTypedParameterPtr params,
*values = g_new0(const char *, nfiltered);
for (i = 0; i < nfiltered; i++) {
- if (filtered[i]->type == VIR_TYPED_PARAM_STRING)
- (*values)[n++] = filtered[i]->value.s;
+ (*values)[i] = filtered[i]->value.s;
}
- return n;
+ return nfiltered;
}
--
2.46.0