Fix file descriptor leak (on `bind()` failure) in QUIC client. PiperOrigin-RevId: 471918850
diff --git a/quiche/quic/tools/quic_client_default_network_helper.cc b/quiche/quic/tools/quic_client_default_network_helper.cc index 24c4b3e..a408a8f 100644 --- a/quiche/quic/tools/quic_client_default_network_helper.cc +++ b/quiche/quic/tools/quic_client_default_network_helper.cc
@@ -4,6 +4,7 @@ #include "quiche/quic/tools/quic_client_default_network_helper.h" +#include "absl/cleanup/cleanup.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/quic_default_packet_writer.h" #include "quiche/quic/core/quic_packets.h" @@ -71,6 +72,7 @@ if (fd < 0) { return false; } + auto closer = absl::MakeCleanup([fd] { close(fd); }); QuicSocketAddress client_address; if (bind_to_address.IsInitialized()) { @@ -113,10 +115,13 @@ << strerror(errno); } - fd_address_map_[fd] = client_address; - bool success = event_loop_->RegisterSocket( - fd, kSocketEventReadable | kSocketEventWritable, this); - return success; + if (event_loop_->RegisterSocket( + fd, kSocketEventReadable | kSocketEventWritable, this)) { + fd_address_map_[fd] = client_address; + std::move(closer).Cancel(); + return true; + } + return false; } void QuicClientDefaultNetworkHelper::CleanUpUDPSocket(int fd) {
diff --git a/quiche/quic/tools/quic_client_epoll_network_helper.cc b/quiche/quic/tools/quic_client_epoll_network_helper.cc index b9798bd..60bf6c1 100644 --- a/quiche/quic/tools/quic_client_epoll_network_helper.cc +++ b/quiche/quic/tools/quic_client_epoll_network_helper.cc
@@ -11,6 +11,7 @@ #include <sys/socket.h> #include <unistd.h> +#include "absl/cleanup/cleanup.h" #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/http/spdy_utils.h" #include "quiche/quic/core/quic_connection.h" @@ -62,6 +63,7 @@ if (fd < 0) { return false; } + auto closer = absl::MakeCleanup([fd] { close(fd); }); QuicSocketAddress client_address; if (bind_to_address.IsInitialized()) { @@ -106,6 +108,7 @@ fd_address_map_[fd] = client_address; epoll_server_->RegisterFD(fd, this, kEpollFlags); + std::move(closer).Cancel(); return true; }