From e5fae984b1c500d5199ace234cdae2bc89da9065 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 27 Sep 2024 11:15:06 +0200 Subject: [PATCH] virTypedParamsGetStringList: Refactor and adjust docs Use automatic freeing, declare one variable per line and return early when possible. As this is an internal helper there's no need to check that the caller passed non-NULL @values. Modify the documentation to be accurate and warn callers to not free the strings just the array. Signed-off-by: Peter Krempa Reviewed-by: Pavel Hrdina --- src/util/virtypedparam.c | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c index 634385aa97..86fbaf5e9d 100644 --- a/src/util/virtypedparam.c +++ b/src/util/virtypedparam.c @@ -432,13 +432,13 @@ virTypedParamsFilter(virTypedParameterPtr params, * @values: array of returned values * * Finds all parameters with desired @name within @params and - * store their values into @values. The @values array is self - * allocated and its length is stored into @picked. When no - * longer needed, caller should free the returned array, but not - * the items since they are taken from @params array. + * store their values into @values. * - * Returns amount of strings in @values array on success, - * -1 otherwise. + * 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 + * not the contents. + * + * Returns amount of strings in @values array on success. */ int virTypedParamsGetStringList(virTypedParameterPtr params, @@ -446,31 +446,26 @@ virTypedParamsGetStringList(virTypedParameterPtr params, const char *name, const char ***values) { - size_t i, n; + size_t i; + size_t n = 0; size_t nfiltered; - virTypedParameterPtr *filtered = NULL; + g_autofree virTypedParameterPtr *filtered = NULL; - virCheckNonNullArgGoto(values, error); *values = NULL; nfiltered = virTypedParamsFilter(params, nparams, name, &filtered); - if (nfiltered) - *values = g_new0(const char *, nfiltered); + if (nfiltered == 0) + return 0; + + *values = g_new0(const char *, nfiltered); - for (n = 0, i = 0; i < nfiltered; i++) { + for (i = 0; i < nfiltered; i++) { if (filtered[i]->type == VIR_TYPED_PARAM_STRING) (*values)[n++] = filtered[i]->value.s; } - VIR_FREE(filtered); return n; - - error: - if (values) - VIR_FREE(*values); - VIR_FREE(filtered); - return -1; } -- 2.39.5