]> granicus.if.org Git - libnl/commitdiff
Prevent potential socket file descriptor leak
authorКоренберг Марк (дома) <socketpair@gmail.com>
Wed, 29 Aug 2012 22:33:40 +0000 (04:33 +0600)
committerКоренберг Марк (дома) <socketpair@gmail.com>
Wed, 29 Aug 2012 22:36:28 +0000 (04:36 +0600)
This may happen when passing connected socket to nl_cache_mngr_alloc().

Now, nl_connect() will return error trying to connect already connected socket.

Also, dont call close(-1) if socket() fails.

lib/nl.c

index 6b2f027b4e07cb33ef6b29593d15d18909a9e306..d3e67aa6242802d5a375aabf5e7f699c3640eb07 100644 (file)
--- a/lib/nl.c
+++ b/lib/nl.c
@@ -69,6 +69,8 @@
  * Creates a netlink socket using the specified protocol, binds the socket
  * and issues a connection attempt.
  *
+ * This function fail if socket is already connected.
+ *
  * @note SOCK_CLOEXEC is set on the socket if available.
  *
  * @return 0 on success or a negative error code.
@@ -82,6 +84,9 @@ int nl_connect(struct nl_sock *sk, int protocol)
        flags |= SOCK_CLOEXEC;
 #endif
 
+        if (sk->s_fd != -1)
+                return -NLE_BAD_SOCK;
+
        sk->s_fd = socket(AF_NETLINK, SOCK_RAW | flags, protocol);
        if (sk->s_fd < 0) {
                err = -nl_syserr2nlerr(errno);
@@ -123,8 +128,10 @@ int nl_connect(struct nl_sock *sk, int protocol)
 
        return 0;
 errout:
-       close(sk->s_fd);
-       sk->s_fd = -1;
+        if (sk->s_fd != -1) {
+               close(sk->s_fd);
+               sk->s_fd = -1;
+        }
 
        return err;
 }