From d266f44ef35e42331e2f56572f7db434dfa614e3 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Thu, 30 Jul 2020 09:19:00 +0200 Subject: [PATCH] libc: free resources on socket creation failure Issue #3766 --- .../libports/src/lib/libc/socket_fs_plugin.cc | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/repos/libports/src/lib/libc/socket_fs_plugin.cc b/repos/libports/src/lib/libc/socket_fs_plugin.cc index b2f398b185..55dfc746aa 100644 --- a/repos/libports/src/lib/libc/socket_fs_plugin.cc +++ b/repos/libports/src/lib/libc/socket_fs_plugin.cc @@ -563,7 +563,20 @@ extern "C" int socket_fs_accept(int libc_fd, sockaddr *addr, socklen_t *addrlen) Libc::Allocator alloc { }; accept_context = new (alloc) Socket_fs::Context(listen_context->proto(), handle_fd); - } catch (New_socket_failed) { return Errno(EACCES); } + } catch (New_socket_failed) { + close(handle_fd); + return Errno(EACCES); + } + + if (addr && addrlen) { + Socket_fs::Remote_functor func(*accept_context, false); + int ret = read_sockaddr_in(func, (sockaddr_in *)addr, addrlen); + if (ret == -1) { + Libc::Allocator alloc { }; + destroy(alloc, accept_context); + return ret; + } + } File_descriptor *accept_fd = file_descriptor_allocator()->alloc(&plugin(), accept_context); @@ -571,12 +584,6 @@ extern "C" int socket_fs_accept(int libc_fd, sockaddr *addr, socklen_t *addrlen) /* inherit the O_NONBLOCK flag if set */ accept_context->fd_flags(listen_context->fd_flags()); - if (addr && addrlen) { - Socket_fs::Remote_functor func(*accept_context, false); - int ret = read_sockaddr_in(func, (sockaddr_in *)addr, addrlen); - if (ret == -1) return ret; - } - return accept_fd->libc_fd; }