net.c: Fix a fd leak in create_local_socket().
authorAndre Noll <maan@systemlinux.org>
Sun, 2 Sep 2007 14:57:15 +0000 (16:57 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 2 Sep 2007 14:57:15 +0000 (16:57 +0200)
The old code leaked the open socket fd in case of errors.

net.c

diff --git a/net.c b/net.c
index cb504f3..a9708fc 100644 (file)
--- a/net.c
+++ b/net.c
@@ -394,18 +394,22 @@ int create_local_socket(const char *name, struct sockaddr_un *unix_addr,
 {
        int fd, ret;
 
-       fd = socket(PF_UNIX, SOCK_STREAM, 0);
-       if (fd < 0)
-               return -E_SOCKET;
-//     unlink(name);
        ret = init_unix_addr(unix_addr, name);
        if (ret < 0)
                return ret;
+       fd = socket(PF_UNIX, SOCK_STREAM, 0);
+       if (fd < 0)
+               return -E_SOCKET;
+       ret = -E_BIND;
        if (bind(fd, (struct sockaddr *) unix_addr, UNIX_PATH_MAX) < 0)
-               return -E_BIND;
+               goto err;
+       ret = -E_CHMOD;
        if (chmod(name, mode) < 0)
-               return -E_CHMOD;
+               goto err;
        return fd;
+err:
+       close(fd);
+       return ret;
 }
 
 #ifndef HAVE_UCRED