diff options
author | Andrew Tridgell <tridge@samba.org> | 2006-09-16 17:57:50 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2006-09-16 17:57:50 +0000 |
commit | 4f9dc31e3ea07b77a2e7392070ed703feaefe309 (patch) | |
tree | 1d59ad5e9ba428a8e5db41d29c40ba31342d7a13 /source/lib | |
parent | 2c519382fbdbd79a4a6d25772b6cfc5e7e342635 (diff) | |
download | samba-4f9dc31e3ea07b77a2e7392070ed703feaefe309.tar.gz samba-4f9dc31e3ea07b77a2e7392070ed703feaefe309.tar.xz samba-4f9dc31e3ea07b77a2e7392070ed703feaefe309.zip |
r18586: fixed a potential fd and memory leak in the socket_wrapper code
Diffstat (limited to 'source/lib')
-rw-r--r-- | source/lib/socket_wrapper/socket_wrapper.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/source/lib/socket_wrapper/socket_wrapper.c b/source/lib/socket_wrapper/socket_wrapper.c index 4fecc909801..fe0b4dfe76b 100644 --- a/source/lib/socket_wrapper/socket_wrapper.c +++ b/source/lib/socket_wrapper/socket_wrapper.c @@ -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); |