r18586: fixed a potential fd and memory leak in the socket_wrapper code
authorAndrew Tridgell <tridge@samba.org>
Sat, 16 Sep 2006 17:57:50 +0000 (17:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:18:52 +0000 (14:18 -0500)
(This used to be commit 6d53f2f5bc3a008f957be9e32df6830e1e29e8ed)

source4/lib/socket_wrapper/socket_wrapper.c

index 4fecc90980152f754ba61ff59ca5badc430d788b..fe0b4dfe76b8a86dfb8a08a89e525a397441bcbd 100644 (file)
@@ -494,7 +494,10 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
 
        ret = sockaddr_convert_from_un(parent_si, &un_addr, un_addrlen,
                                       parent_si->family, addr, addrlen);
-       if (ret == -1) return ret;
+       if (ret == -1) {
+               close(fd);
+               return ret;
+       }
 
        child_si = malloc(sizeof(struct socket_info));
        memset(child_si, 0, sizeof(*child_si));
@@ -506,11 +509,19 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
        child_si->bound = 1;
 
        ret = real_getsockname(fd, (struct sockaddr *)&un_my_addr, &un_my_addrlen);
-       if (ret == -1) return ret;
+       if (ret == -1) {
+               free(child_si);
+               close(fd);
+               return ret;
+       }
 
        ret = sockaddr_convert_from_un(child_si, &un_my_addr, un_my_addrlen,
                                       child_si->family, &my_addr, &my_addrlen);
-       if (ret == -1) return ret;
+       if (ret == -1) {
+               free(child_si);
+               close(fd);
+               return ret;
+       }
 
        child_si->myname_len = my_addrlen;
        child_si->myname = sockaddr_dup(&my_addr, my_addrlen);