[libvirt PATCH 02/14] qemu: agent: split out qemuAgentGetInterfaceOneAddress
Jonathon Jongsma
jjongsma at redhat.com
Tue Oct 6 19:41:59 UTC 2020
On Tue, 6 Oct 2020 08:58:38 +0200
Ján Tomko <jtomko at redhat.com> wrote:
> A function that takes one entry from the "ip-addresses" array
> returned by "guest-network-get-interfaces" and converts it
> into virDomainIPAddress.
>
> Signed-off-by: Ján Tomko <jtomko at redhat.com>
> ---
> src/qemu/qemu_agent.c | 78
> +++++++++++++++++++++++++------------------ 1 file changed, 46
> insertions(+), 32 deletions(-)
>
> diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
> index 456f0b69e6..fc7b65de2a 100644
> --- a/src/qemu/qemu_agent.c
> +++ b/src/qemu/qemu_agent.c
> @@ -2059,6 +2059,51 @@ qemuAgentGetFSInfo(qemuAgentPtr agent,
> return ret;
> }
>
> +
> +static int
> +qemuAgentGetInterfaceOneAddress(virDomainIPAddressPtr ip_addr,
> + virJSONValuePtr ip_addr_obj,
> + const char *name)
> +{
> + const char *type, *addr;
> +
> + type = virJSONValueObjectGetString(ip_addr_obj,
> "ip-address-type");
> + if (!type) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("qemu agent didn't provide
> 'ip-address-type'"
> + " field for interface '%s'"), name);
> + return -1;
> + } else if (STREQ(type, "ipv4")) {
> + ip_addr->type = VIR_IP_ADDR_TYPE_IPV4;
> + } else if (STREQ(type, "ipv6")) {
> + ip_addr->type = VIR_IP_ADDR_TYPE_IPV6;
> + } else {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown ip address type '%s'"),
> + type);
> + return -1;
> + }
> +
> + addr = virJSONValueObjectGetString(ip_addr_obj, "ip-address");
> + if (!addr) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("qemu agent didn't provide 'ip-address'"
> + " field for interface '%s'"), name);
> + return -1;
> + }
> + ip_addr->addr = g_strdup(addr);
(This comment is also true of the existing code, but somehow it feels a
bit more fragile when it's extracted out to its own function)
If the "prefix" check below fails, we will have allocated memory for
the address but will return a failure status. That string may leak if
the calling code does not increment iface->naddrs even on failure.
Perhaps we should only allocate the string if all sanity checks pass and
we are guaranteed to return success from this function?
> +
> + if (virJSONValueObjectGetNumberUint(ip_addr_obj, "prefix",
> + &ip_addr->prefix) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("malformed 'prefix' field"));
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +
> /*
> * qemuAgentGetInterfaces:
> * @agent: agent object
> @@ -2176,7 +2221,6 @@ qemuAgentGetInterfaces(qemuAgentPtr agent,
> addrs_count = iface->naddrs;
>
> for (j = 0; j < virJSONValueArraySize(ip_addr_arr); j++) {
> - const char *type, *addr;
> virJSONValuePtr ip_addr_obj =
> virJSONValueArrayGet(ip_addr_arr, j); virDomainIPAddressPtr ip_addr;
>
> @@ -2192,38 +2236,8 @@ qemuAgentGetInterfaces(qemuAgentPtr agent,
> goto error;
> }
>
> - type = virJSONValueObjectGetString(ip_addr_obj,
> "ip-address-type");
> - if (!type) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("qemu agent didn't provide
> 'ip-address-type'"
> - " field for interface '%s'"), name);
> + if (qemuAgentGetInterfaceOneAddress(ip_addr,
> ip_addr_obj, name) < 0) goto error;
> - } else if (STREQ(type, "ipv4")) {
> - ip_addr->type = VIR_IP_ADDR_TYPE_IPV4;
> - } else if (STREQ(type, "ipv6")) {
> - ip_addr->type = VIR_IP_ADDR_TYPE_IPV6;
> - } else {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("unknown ip address type '%s'"),
> - type);
> - goto error;
> - }
> -
> - addr = virJSONValueObjectGetString(ip_addr_obj,
> "ip-address");
> - if (!addr) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("qemu agent didn't provide
> 'ip-address'"
> - " field for interface '%s'"), name);
> - goto error;
> - }
> - ip_addr->addr = g_strdup(addr);
> -
> - if (virJSONValueObjectGetNumberUint(ip_addr_obj,
> "prefix",
> - &ip_addr->prefix) <
> 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("malformed 'prefix' field"));
> - goto error;
> - }
> }
>
> iface->naddrs = addrs_count;
More information about the libvir-list
mailing list