[libvirt] [PATCH 1/5] RPC: Allow HW address in remote_domain_interface struct to be NULL
Daniel P. Berrange
berrange at redhat.com
Tue Mar 17 17:18:43 UTC 2015
On Tue, Mar 17, 2015 at 05:52:53PM +0100, Michal Privoznik wrote:
> Not all NICs (esp. the virtual ones like TUN) must have a hardware
> address. Learn our RPC that it's possible.
s/Learn/Teach/
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> daemon/remote.c | 5 ++++-
> include/libvirt/libvirt-domain.h | 2 +-
> src/libvirt-domain.c | 3 ++-
> src/remote/remote_driver.c | 3 ++-
> src/remote/remote_protocol.x | 2 +-
> src/remote_protocol-structs | 2 +-
> 6 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 1dca64a..b6ea236 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -6525,7 +6525,9 @@ remoteSerializeDomainInterface(virDomainInterfacePtr *ifaces,
> if ((VIR_STRDUP(iface_ret->name, iface->name)) < 0)
> goto cleanup;
>
> - if ((VIR_STRDUP(iface_ret->hwaddr, iface->hwaddr)) < 0)
> + if (iface->hwaddr &&
> + (VIR_ALLOC(iface_ret->hwaddr) < 0 ||
> + VIR_STRDUP(*iface_ret->hwaddr, iface->hwaddr) < 0))
> goto cleanup;
>
> if (iface->naddrs > REMOTE_DOMAIN_IP_ADDR_MAX) {
> @@ -6561,6 +6563,7 @@ remoteSerializeDomainInterface(virDomainInterfacePtr *ifaces,
> for (i = 0; i < ifaces_count; i++) {
> remote_domain_interface *iface_ret = &(ret->ifaces.ifaces_val[i]);
> VIR_FREE(iface_ret->name);
> + VIR_FREE(*iface_ret->hwaddr);
This will crash if hwaddr was NULL, and also leak
if (iface_ret->hwaddr)
VIR_FREE(*iface_ret->hwaddr);
VIR_FREE(iface_ret->hwaddr);
> VIR_FREE(iface_ret->hwaddr);
> for (j = 0; j < iface_ret->addrs.addrs_len; j++) {
> remote_domain_ip_addr *ip_addr =
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index a026b9a..79ba3d7 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -3760,7 +3760,7 @@ typedef struct _virDomainInterface virDomainInterface;
> typedef virDomainInterface *virDomainInterfacePtr;
> struct _virDomainInterface {
> char *name; /* interface name */
> - char *hwaddr; /* hardware address */
> + char *hwaddr; /* hardware address, may be NULL */
> unsigned int naddrs; /* number of items in @addrs */
> virDomainIPAddressPtr addrs; /* array of IP addresses */
> };
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index a3f179d..0bd9274 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -11460,7 +11460,8 @@ virDomainFSInfoFree(virDomainFSInfoPtr info)
> * ... do something with returned values, for example:
> * for (i = 0; i < ifaces_count; i++) {
> * printf("name: %s", ifaces[i]->name);
> - * printf(" hwaddr: %s", ifaces[i]->hwaddr);
> + * if (ifaces[i]->hwaddr)
> + * printf(" hwaddr: %s", ifaces[i]->hwaddr);
> *
> * for (j = 0; j < ifaces[i]->naddrs; j++) {
> * virDomainIPAddressPtr ip_addr = ifaces[i]->addrs + j;
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index d89db47..e69f235 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -7963,7 +7963,8 @@ remoteDomainInterfaceAddresses(virDomainPtr dom,
> if (VIR_STRDUP(iface->name, iface_ret->name) < 0)
> goto cleanup;
>
> - if (VIR_STRDUP(iface->hwaddr, iface_ret->hwaddr) < 0)
> + if (iface_ret->hwaddr &&
> + VIR_STRDUP(iface->hwaddr, *iface_ret->hwaddr) < 0)
> goto cleanup;
>
> if (iface_ret->addrs.addrs_len > REMOTE_DOMAIN_IP_ADDR_MAX) {
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index fe5fcdc..eb862e1 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -3191,7 +3191,7 @@ struct remote_domain_ip_addr {
>
> struct remote_domain_interface {
> remote_nonnull_string name;
> - remote_nonnull_string hwaddr;
> + remote_string hwaddr;
> remote_domain_ip_addr addrs<REMOTE_DOMAIN_IP_ADDR_MAX>;
> };
>
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index 5f4ebff..b3e2e40 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -2646,7 +2646,7 @@ struct remote_domain_ip_addr {
> };
> struct remote_domain_interface {
> remote_nonnull_string name;
> - remote_nonnull_string hwaddr;
> + remote_string hwaddr;
> struct {
> u_int addrs_len;
> remote_domain_ip_addr * addrs_val;
ACK with the inline fix applied
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list