Otherwise this will leak an fd each time one of these functions is called. --- src/util/interface.c | 36 ++++++++++++++++++++++++++---------- 1 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/util/interface.c b/src/util/interface.c index f486124..178a4dd 100644 --- a/src/util/interface.c +++ b/src/util/interface.c @@ -413,6 +413,7 @@ ifaceGetMacAddress(const char *ifname, { struct ifreq ifr; int fd; + int rc = 0; if (!ifname) return EINVAL; @@ -422,15 +423,21 @@ ifaceGetMacAddress(const char *ifname, return errno; memset(&ifr, 0, sizeof(struct ifreq)); - if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) - return EINVAL; + if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) { + rc = EINVAL; + goto err_exit; + } - if (ioctl(fd, SIOCGIFHWADDR, (char *)&ifr) != 0) - return errno; + if (ioctl(fd, SIOCGIFHWADDR, (char *)&ifr) != 0) { + rc = errno; + goto err_exit; + } memcpy(macaddr, ifr.ifr_ifru.ifru_hwaddr.sa_data, VIR_MAC_BUFLEN); - return 0; +err_exit: + VIR_FORCE_CLOSE(fd); + return rc; } #else @@ -461,6 +468,7 @@ ifaceSetMacAddress(const char *ifname, { struct ifreq ifr; int fd; + int rc = 0; if (!ifname) return EINVAL; @@ -470,16 +478,24 @@ ifaceSetMacAddress(const char *ifname, return errno; memset(&ifr, 0, sizeof(struct ifreq)); - if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) - return EINVAL; + if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) { + rc = EINVAL; + goto err_exit; + } /* To fill ifr.ifr_hdaddr.sa_family field */ - if (ioctl(fd, SIOCGIFHWADDR, &ifr) != 0) - return errno; + if (ioctl(fd, SIOCGIFHWADDR, &ifr) != 0) { + rc = errno; + goto err_exit; + } memcpy(ifr.ifr_hwaddr.sa_data, macaddr, VIR_MAC_BUFLEN); - return ioctl(fd, SIOCSIFHWADDR, &ifr) == 0 ? 0 : errno; + rc = ioctl(fd, SIOCSIFHWADDR, &ifr) == 0 ? 0 : errno; + +err_exit: + VIR_FORCE_CLOSE(fd); + return rc; } #else -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list