From: Wolfgang Bumiller Date: Wed, 6 Apr 2016 08:56:04 +0000 (+0200) Subject: netlink_open: close socket on error X-Git-Tag: lxc-1.0.9~68 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8b435e392df8d3658c7b119ea84ea2a156f9492;p=thirdparty%2Flxc.git netlink_open: close socket on error 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 --- diff --git a/src/lxc/nl.c b/src/lxc/nl.c index cfa5cdf22..19a3a6c06 100644 --- a/src/lxc/nl.c +++ b/src/lxc/nl.c @@ -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)