diff --git a/src/util/virmacmap.c b/src/util/virmacmap.c index 88ca9b3f36..c7b700fa05 100644 --- a/src/util/virmacmap.c +++ b/src/util/virmacmap.c @@ -90,7 +90,6 @@ virMacMapAddLocked(virMacMapPtr mgr, { int ret = -1; char **macsList = NULL; - char **newMacsList = NULL; if ((macsList = virHashLookup(mgr->macs, domain)) && virStringListHasString((const char**) macsList, mac)) { @@ -98,15 +97,12 @@ virMacMapAddLocked(virMacMapPtr mgr, goto cleanup; } - if (!(newMacsList = virStringListAdd((const char **) macsList, mac)) || - virHashUpdateEntry(mgr->macs, domain, newMacsList) < 0) + if (virStringListAdd(&macsList, mac) < 0 || + virHashUpdateEntry(mgr->macs, domain, macsList) < 0) goto cleanup; - newMacsList = NULL; - virStringListFree(macsList); ret = 0; cleanup: - virStringListFree(newMacsList); return ret; } diff --git a/src/util/virstring.c b/src/util/virstring.c index 93fda69d7f..afad5736e1 100644 --- a/src/util/virstring.c +++ b/src/util/virstring.c @@ -175,32 +175,23 @@ char *virStringListJoin(const char **strings, * @strings: a NULL-terminated array of strings * @item: string to add * - * Creates new strings list with all strings duplicated and @item - * at the end of the list. Callers is responsible for freeing - * both @strings and returned list. + * Appends @item into string list @strings. If *@strings is not + * allocated yet new string list is created. + * + * Returns: 0 on success, + * -1 otherwise */ -char ** -virStringListAdd(const char **strings, +int +virStringListAdd(char ***strings, const char *item) { - char **ret = NULL; - size_t i = virStringListLength(strings); + size_t i = virStringListLength((const char **) *strings); - if (VIR_ALLOC_N(ret, i + 2) < 0) - goto error; + if (VIR_EXPAND_N(*strings, i, 2) < 0 || + VIR_STRDUP((*strings)[i - 2], item) < 0) + return -1; - for (i = 0; strings && strings[i]; i++) { - if (VIR_STRDUP(ret[i], strings[i]) < 0) - goto error; - } - - if (VIR_STRDUP(ret[i], item) < 0) - goto error; - - return ret; - error: - virStringListFree(ret); - return NULL; + return 0; } diff --git a/src/util/virstring.h b/src/util/virstring.h index 125fd4eede..a2133ab7ce 100644 --- a/src/util/virstring.h +++ b/src/util/virstring.h @@ -44,8 +44,8 @@ char *virStringListJoin(const char **strings, const char *delim) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -char **virStringListAdd(const char **strings, - const char *item); +int virStringListAdd(char ***strings, + const char *item); void virStringListRemove(char ***strings, const char *item); diff --git a/tests/virstringtest.c b/tests/virstringtest.c index 1230aba5b7..1a1e6364d1 100644 --- a/tests/virstringtest.c +++ b/tests/virstringtest.c @@ -179,12 +179,8 @@ static int testAdd(const void *args) size_t i; for (i = 0; data->tokens[i]; i++) { - char **tmp = virStringListAdd((const char **)list, data->tokens[i]); - if (!tmp) + if (virStringListAdd(&list, data->tokens[i]) < 0) goto cleanup; - virStringListFree(list); - list = tmp; - tmp = NULL; } if (!list &&