Re: [PATCH 20/28] lxc: move debug/error log when adding IP addresses to virNetDevIPAddrAdd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 06/22/2016 01:37 PM, Laine Stump wrote:
> It makes more sense to have the logging at the lower level so other
> callers can share the goodness.
> 
> While removing so much stuff from / touching so many lines in
> lxcContainerRenameAndEnableInterfaces() (which used to have this
> debug/error logging), label names were changed and it was updated to
> use the now-more-common method of initializing ret to -1 (failure),
> then setting to 0 right before the cleanup label.
> ---
>  src/lxc/lxc_container.c | 60 +++++++++++++++++++++----------------------------
>  src/util/virnetdevip.c  | 32 ++++++++++++++++++++++----
>  2 files changed, 53 insertions(+), 39 deletions(-)
> 
> diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> index a5ced92..09ad8cb 100644
> --- a/src/lxc/lxc_container.c
> +++ b/src/lxc/lxc_container.c
> @@ -484,33 +484,32 @@ lxcContainerGetNetDef(virDomainDefPtr vmDef, const char *devName)
>   *
>   * Returns 0 on success or nonzero in case of error
>   */
> -static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
> -                                                 size_t nveths,
> -                                                 char **veths)
> +static int
> +lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
> +                                      size_t nveths,
> +                                      char **veths)
>  {
> -    int rc = 0;
> +    int ret = -1;
>      size_t i, j;
>      const char *newname;
> -    char *toStr = NULL;
> -    char *viaStr = NULL;
>      virDomainNetDefPtr netDef;
>      bool privNet = vmDef->features[VIR_DOMAIN_FEATURE_PRIVNET] ==
>                     VIR_TRISTATE_SWITCH_ON;
>  
>      for (i = 0; i < nveths; i++) {
>          if (!(netDef = lxcContainerGetNetDef(vmDef, veths[i])))
> -            return -1;
> +            goto cleanup;
>  
>          newname = netDef->ifname_guest;
>          if (!newname) {
> -            rc = -1;
> -            goto error_out;
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Missing device name for container-side veth"));
> +            goto cleanup;
>          }
>  
>          VIR_DEBUG("Renaming %s to %s", veths[i], newname);
> -        rc = virNetDevSetName(veths[i], newname);
> -        if (rc < 0)
> -            goto error_out;
> +        if (virNetDevSetName(veths[i], newname) < 0)
> +           goto cleanup;
>  
>          for (j = 0; j < netDef->guestIP.nips; j++) {
>              virNetDevIPAddrPtr ip = netDef->guestIP.ips[j];
> @@ -519,30 +518,23 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
>  
>              if ((prefix = virSocketAddrGetIPPrefix(&ip->address,
>                                                     NULL, ip->prefix)) < 0) {
> +                ipStr = virSocketAddrFormat(&ip->address);

Coverity complains here that ipStr is overwritten (from 4 lines up -
char *ipStr = virSocketAddrFormat(&ip->address);)

It seems the first one is duplicitous.

>                  virReportError(VIR_ERR_INTERNAL_ERROR,
>                                 _("Failed to determine prefix for IP address '%s'"),
>                                 ipStr);
> -                goto error_out;
> -            }
> -
> -            VIR_DEBUG("Adding IP address '%s/%d' to '%s'",
> -                      ipStr, prefix, newname);
> -            if (virNetDevIPAddrAdd(newname, &ip->address, NULL, prefix) < 0) {
> -                virReportError(VIR_ERR_SYSTEM_ERROR,
> -                               _("Failed to set IP address '%s' on %s"),
> -                               ipStr, newname);
>                  VIR_FREE(ipStr);
> -                goto error_out;
> +                goto cleanup;
>              }
> -            VIR_FREE(ipStr);
> +
> +            if (virNetDevIPAddrAdd(newname, &ip->address, NULL, prefix) < 0)
> +                goto cleanup;
>          }
>  
>          if (netDef->guestIP.nips ||
>              netDef->linkstate == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_UP) {
>              VIR_DEBUG("Enabling %s", newname);
> -            rc = virNetDevSetOnline(newname, true);
> -            if (rc < 0)
> -                goto error_out;
> +            if (virNetDevSetOnline(newname, true) < 0)
> +                goto cleanup;
>  
>              /* Set the routes */
>              for (j = 0; j < netDef->guestIP.nroutes; j++) {
> @@ -553,22 +545,20 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
>                                          virNetDevIPRouteGetPrefix(route),
>                                          virNetDevIPRouteGetGateway(route),
>                                          virNetDevIPRouteGetMetric(route)) < 0) {
> -                    goto error_out;
> +                    goto cleanup;
>                  }
> -                VIR_FREE(toStr);
> -                VIR_FREE(viaStr);

Hmm... Seems commit id 'a117652917e' forgot about 'em....

>              }
>          }
>      }
>  
>      /* enable lo device only if there were other net devices */
> -    if (veths || privNet)
> -        rc = virNetDevSetOnline("lo", true);
> +    if ((veths || privNet) &&
> +        virNetDevSetOnline("lo", true) < 0)
> +       goto cleanup;
>  
> - error_out:
> -    VIR_FREE(toStr);
> -    VIR_FREE(viaStr);
> -    return rc;
> +    ret = 0;
> + cleanup:
> +    return ret;
>  }
>  
>  
> diff --git a/src/util/virnetdevip.c b/src/util/virnetdevip.c
> index 376d4ad..dad342f 100644
> --- a/src/util/virnetdevip.c
> +++ b/src/util/virnetdevip.c
> @@ -173,6 +173,13 @@ virNetDevIPAddrAdd(const char *ifname,
>      struct nl_msg *nlmsg = NULL;
>      struct nlmsghdr *resp = NULL;
>      unsigned int recvbuflen;
> +    char *ipStr = NULL;
> +    char *peerStr = NULL;
> +    char *bcastStr = NULL;
> +
> +    ipStr = virSocketAddrFormat(addr);

Note - no check if ipStr is NULL...

> +    if (peer && VIR_SOCKET_ADDR_VALID(peer))
> +       peerStr = virSocketAddrFormat(peer);
>  
>      /* The caller needs to provide a correct address */
>      if (VIR_SOCKET_ADDR_FAMILY(addr) == AF_INET &&
> @@ -181,28 +188,45 @@ virNetDevIPAddrAdd(const char *ifname,
>          if (VIR_ALLOC(broadcast) < 0)
>              return -1;

Coverity let me know this causes ipStr to be leaked.  Probably similar
for peerStr too, but Coverity didn't note that one.

>  
> -        if (virSocketAddrBroadcastByPrefix(addr, prefix, broadcast) < 0)
> +        if (virSocketAddrBroadcastByPrefix(addr, prefix, broadcast) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Failed to determine broadcast address for '%s/%d'"),
> +                       ipStr, prefix);
>              goto cleanup;
> +        }
> +        bcastStr = virSocketAddrFormat(broadcast);
>      }
>  
> +    VIR_DEBUG("Adding IP address %s/%d%s%s%s%s to %s", ipStr, prefix,
> +              peerStr ? " peer " : "", peerStr ? peerStr : "",
> +              bcastStr ? " bcast " : "", bcastStr ? bcastStr : "",
> +              ifname);
> +

NULLSTR() or perhaps EMPTYSTR()?  For ipStr, peerStr, and bcastStr...

In any case, since ipStr could be NULL it needs the similar check

>      if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_NEWADDR, ifname,
>                                                         addr, prefix,
>                                                         broadcast, peer)))
>          goto cleanup;
>  
> -    if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0,
> -                          NETLINK_ROUTE, 0) < 0)
> +    if (virNetlinkCommand(nlmsg, &resp, &recvbuflen,
> +                          0, 0, NETLINK_ROUTE, 0) < 0)
>          goto cleanup;
>  
>  
>      if (virNetlinkGetErrorCode(resp, recvbuflen) < 0) {
>          virReportError(VIR_ERR_SYSTEM_ERROR,
> -                       _("Error adding IP address to %s"), ifname);
> +                       _("Failed to add IP address %s/%d%s%s%s%s to %s"),
> +                       ipStr, prefix,
> +                       peerStr ? " peer " : "", peerStr ? peerStr : "",
> +                       bcastStr ? " bcast " : "", bcastStr ? bcastStr : "",
> +                       ifname);

Similar comment regarding ipStr, peerStr, and bcastStr usage

ACK with the adjustments,

John

>          goto cleanup;
>      }
>  
>      ret = 0;
>   cleanup:
> +    VIR_FREE(ipStr);
> +    VIR_FREE(peerStr);
> +    VIR_FREE(bcastStr);
>      nlmsg_free(nlmsg);
>      VIR_FREE(resp);
>      VIR_FREE(broadcast);
> 

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]