
On Mon, Aug 29, 2016 at 12:32:34 -0400, John Ferlan wrote: ...
-size_t virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, - char ***names) +int +virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, + char ***names, + size_t *count) { + size_t i; + char **models = NULL; + + *count = 0; if (names) - *names = qemuCaps->cpuDefinitions; - return qemuCaps->ncpuDefinitions; + *names = NULL; + + if (!qemuCaps->cpuDefinitions) + return 0; + + if (names && VIR_ALLOC_N(models, qemuCaps->cpuDefinitions->count) < 0) + return -1; +
So if we don't have names, we don't get models and the following loop will only add to models if we've allocated it because we have names, right?
Thus could there be an optimization to set/return ->count if !names prior to this check? e.g.
It could, but only for a limited time. In the future the for loop will do a bit of filtering and thus we will have to go through it to compute @count.
if (!names) { *count = qemuCaps->cpuDefinitions->count; return 0; }
This works, but it's tough to read.
+ for (i = 0; i < qemuCaps->cpuDefinitions->count; i++) { + virDomainCapsCPUModelPtr cpu = qemuCaps->cpuDefinitions->models + i; + if (models && VIR_STRDUP(models[i], cpu->name) < 0) + goto error; + } + + if (names) + *names = models; + *count = qemuCaps->cpuDefinitions->count; + return 0; + + error: + virStringFreeListCount(models, i); + return -1; } ... @@ -4921,7 +4927,11 @@ int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, cpulist = NULL;
cleanup: - virStringFreeList(cpulist); + if (ret < 0 && cpulist) {
I think "ret < 0" is superfluous... Coverity whines too
Right. Fixed. Jirka