]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
netlink_open: close socket on error
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Wed, 6 Apr 2016 08:56:04 +0000 (10:56 +0200)
committerStéphane Graber <stgraber@ubuntu.com>
Thu, 17 Nov 2016 23:16:59 +0000 (18:16 -0500)
All uses of netlink_open() assume that on error the
nl_handler doesn't need to be closed, but some error cases
happen after the socket was opened successfully and used to
simply return -errno.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
src/lxc/nl.c

index cfa5cdf2237482128f8d636ba8028c80a15df5c4..19a3a6c0615ac772dfbbae7d36d0584bb80f7727 100644 (file)
@@ -265,6 +265,7 @@ extern int netlink_open(struct nl_handler *handler, int protocol)
        socklen_t socklen;
        int sndbuf = 32768;
        int rcvbuf = 32768;
+       int err;
 
        memset(handler, 0, sizeof(*handler));
 
@@ -274,11 +275,11 @@ extern int netlink_open(struct nl_handler *handler, int protocol)
 
        if (setsockopt(handler->fd, SOL_SOCKET, SO_SNDBUF,
                       &sndbuf, sizeof(sndbuf)) < 0)
-               return -errno;
+               goto err_with_errno;
 
        if (setsockopt(handler->fd, SOL_SOCKET, SO_RCVBUF,
                       &rcvbuf,sizeof(rcvbuf)) < 0)
-               return -errno;
+               goto err_with_errno;
 
        memset(&handler->local, 0, sizeof(handler->local));
        handler->local.nl_family = AF_NETLINK;
@@ -286,22 +287,31 @@ extern int netlink_open(struct nl_handler *handler, int protocol)
 
        if (bind(handler->fd, (struct sockaddr*)&handler->local,
                 sizeof(handler->local)) < 0)
-               return -errno;
+               goto err_with_errno;
 
        socklen = sizeof(handler->local);
        if (getsockname(handler->fd, (struct sockaddr*)&handler->local,
                        &socklen) < 0)
-               return -errno;
+               goto err_with_errno;
 
-       if (socklen != sizeof(handler->local))
-               return -EINVAL;
+       if (socklen != sizeof(handler->local)) {
+               err = -EINVAL;
+               goto errclose;
+       }
 
-       if (handler->local.nl_family != AF_NETLINK)
-               return -EINVAL;
+       if (handler->local.nl_family != AF_NETLINK) {
+               err = -EINVAL;
+               goto errclose;
+       }
 
        handler->seq = time(NULL);
 
        return 0;
+err_with_errno:
+       err = -errno;
+errclose:
+       close(handler->fd);
+       return err;
 }
 
 extern int netlink_close(struct nl_handler *handler)