[libvirt] [PATCH] qemu: don't fill in nicindexes if unneeded
John Ferlan
jferlan at redhat.com
Tue Feb 24 00:57:53 UTC 2015
On 02/23/2015 03:12 PM, Laine Stump wrote:
> The patch I posted failed to pass make check for two reasons:
>
> 1) There are valid use cases when the interface object is
> type='ethernet' but has no ifname. Apparently if you provide an "ifup"
> script name for -netdev but don't specify a tap device name, qemu will
> create a tap device for you, and in that case of course libvirt would be
> unable to provide the name to systemd.
>
> 2) Even if we avoid the code to look for the ifindex when ifname is
> NULL (see (1), make check will *still* fail because there are tests in
> the suite that have type='ethernet' and still have an ifname
> specified, but that device of course doesn't actually exist on the
> test system, so attempts to call virNetDevGetIndex() will
> fail. The solution here is to change qemuBuildInterfaceCommandline()
> so that it won't even try to add anything to the nicindexes array if
> NULL is sent in the args, and modify the calls from test programs to
> do exactly that.
>
> I intend to squash this patch into the original, already acked by danpb.
> ---
> src/qemu/qemu_command.c | 13 ++++++-------
> src/qemu/qemu_driver.c | 6 +-----
> tests/qemuxml2argvtest.c | 5 +----
> tests/qemuxmlnstest.c | 5 +----
> 4 files changed, 9 insertions(+), 20 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 81f6982..1e63905 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7840,10 +7840,12 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
Since you're merging anyway... The comment to the switch needs some
adjustment:
+ /* For types whose implementions use a netdev on the host, add an
+ * entry to nicifindexes for passing on to systemd.
+ */
-> s/implementions/implementations
-> s/nicifindexes/nicindexes
-> s/'*/'/' */'/, e.g. needs one extra space to be properly aligned
> /* network and bridge use a tap device, and direct uses a
> * macvtap device
> */
> - if (virNetDevGetIndex(net->ifname, &nicindex) < 0 ||
> - VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) < 0)
> - goto cleanup;
> - break;
> + if (nicindexes && nnicindexes && net->ifname) {
^^ Adding the net->ifname check sets off the Coverity FORWARD_NULL check
later on in the following code
7874 if (actualBandwidth) {
7875 if (virNetDevSupportBandwidth(actualType)) {
7876 if (virNetDevBandwidthSet(net->ifname,
actualBandwidth, false) < 0)
It doesn't seem from some quick testing that we could run into a
situation where net->ifname could be NULL in that second call - one
would have to set bandwidth options... in any case to keep Coverity
happy and perhaps be extra paranoid a "if (net->ifname &&
actualBandwidth)" would avoid the situation.
Beyond that it seems things are fine... So consider it an ACK as long as
you address the Coverity error
John
> + if (virNetDevGetIndex(net->ifname, &nicindex) < 0 ||
> + VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) < 0)
> + goto cleanup;
> + }
> + break;
> }
>
> case VIR_DOMAIN_NET_TYPE_USER:
> @@ -8257,9 +8259,6 @@ qemuBuildCommandLine(virConnectPtr conn,
>
> virUUIDFormat(def->uuid, uuid);
>
> - *nnicindexes = 0;
> - *nicindexes = NULL;
> -
> emulator = def->emulator;
>
> if (!cfg->privileged) {
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index bec05d4..04fa8fa 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6447,8 +6447,6 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
> size_t i;
> virQEMUDriverConfigPtr cfg;
> virCapsPtr caps = NULL;
> - size_t nnicindexes = 0;
> - int *nicindexes = NULL;
>
> virCheckFlags(0, NULL);
>
> @@ -6634,14 +6632,12 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
> &buildCommandLineCallbacks,
> true,
> qemuCheckFips(),
> - NULL,
> - &nnicindexes, &nicindexes)))
> + NULL, NULL, NULL)))
> goto cleanup;
>
> ret = virCommandToString(cmd);
>
> cleanup:
> - VIR_FREE(nicindexes);
> virObjectUnref(qemuCaps);
> virCommandFree(cmd);
> virDomainDefFree(def);
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 16f325e..7eba5c9 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -263,8 +263,6 @@ static int testCompareXMLToArgvFiles(const char *xml,
> char *log = NULL;
> virCommandPtr cmd = NULL;
> size_t i;
> - size_t nnicindexes = 0;
> - int *nicindexes = NULL;
> virBitmapPtr nodeset = NULL;
>
> if (!(conn = virGetConnect()))
> @@ -355,7 +353,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
> VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
> &testCallbacks, false,
> (flags & FLAG_FIPS),
> - nodeset, &nnicindexes, &nicindexes))) {
> + nodeset, NULL, NULL))) {
> if (!virtTestOOMActive() &&
> (flags & FLAG_EXPECT_FAILURE)) {
> ret = 0;
> @@ -402,7 +400,6 @@ static int testCompareXMLToArgvFiles(const char *xml,
> ret = 0;
>
> out:
> - VIR_FREE(nicindexes);
> VIR_FREE(log);
> VIR_FREE(expectargv);
> VIR_FREE(actualargv);
> diff --git a/tests/qemuxmlnstest.c b/tests/qemuxmlnstest.c
> index a068135..4220737 100644
> --- a/tests/qemuxmlnstest.c
> +++ b/tests/qemuxmlnstest.c
> @@ -44,8 +44,6 @@ static int testCompareXMLToArgvFiles(const char *xml,
> char *log = NULL;
> char *emulator = NULL;
> virCommandPtr cmd = NULL;
> - size_t nnicindexes = 0;
> - int *nicindexes = NULL;
>
> if (!(conn = virGetConnect()))
> goto fail;
> @@ -122,7 +120,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
> migrateFrom, migrateFd, NULL,
> VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
> &testCallbacks, false, false, NULL,
> - &nnicindexes, &nicindexes)))
> + NULL, NULL)))
> goto fail;
>
> if (!virtTestOOMActive()) {
> @@ -158,7 +156,6 @@ static int testCompareXMLToArgvFiles(const char *xml,
> ret = 0;
>
> fail:
> - VIR_FREE(nicindexes);
> VIR_FREE(log);
> VIR_FREE(emulator);
> VIR_FREE(expectargv);
>
More information about the libvir-list
mailing list