From 5f0c1c1e25366976451f7507e38d8ac843e4ac13 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabiano=20Fid=C3=AAncio?= Date: Thu, 20 Sep 2018 15:28:50 +0200 Subject: [PATCH] xen_common: Change xenParsePCIList to use virConfGetValueStringList MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The `if(!list || list->type != VIR_CONF_LIST)` check couldn't be written in a 100% similar way. Instead, we're just checking whether `virConfGetValueStringList() <= 0` and creating a new function to: - return -1 in case virConfGetValueStringList fails either due to some allocation failure or when traversing the list; - resetting the last error and return 0 otherwise; Taking this approach we can have the behaviour with the new code as close as possible to the old one. Signed-off-by: Fabiano Fidêncio Reviewed-by: John Ferlan --- src/xenconfig/xen_common.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index 25fd432bde..ed3d89c2c6 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -454,21 +454,41 @@ xenParsePCI(char *entry) } +static int +xenHandleConfGetValueStringListErrors(int ret) +{ + if (ret < 0) { + /* It means virConfGetValueStringList() didn't fail because the + * cval->type switch fell through - since we're passing + * @compatString == false - assumes failures for memory allocation + * and VIR_CONF_LIST traversal failure should cause -1 to be + * returned to the caller with the error message set. */ + if (virGetLastErrorCode() != VIR_ERR_INTERNAL_ERROR) + return -1; + + /* If we did fall through the switch, then ignore and clear the + * last error. */ + virResetLastError(); + } + return 0; +} + + static int xenParsePCIList(virConfPtr conf, virDomainDefPtr def) { - virConfValuePtr list = virConfGetValue(conf, "pci"); + VIR_AUTOPTR(virString) pcis = NULL; + virString *entries = NULL; + int rc; - if (!list || list->type != VIR_CONF_LIST) - return 0; + if ((rc = virConfGetValueStringList(conf, "pci", false, &pcis)) <= 0) + return xenHandleConfGetValueStringListErrors(rc); - for (list = list->list; list; list = list->next) { + for (entries = pcis; *entries; entries++) { + virString entry = *entries; virDomainHostdevDefPtr hostdev; - if ((list->type != VIR_CONF_STRING) || (list->str == NULL)) - continue; - - if (!(hostdev = xenParsePCI(list->str))) + if (!(hostdev = xenParsePCI(entry))) return -1; if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev) < 0) { -- 2.39.5