From 49303597a82920e4d706e001d9322b5e6a0cdbe1 Mon Sep 17 00:00:00 2001 From: Mihail Slobodyanuk Date: Fri, 7 Apr 2023 07:55:10 +0000 Subject: [PATCH 1/6] Fix Socket remoteAddress obtaining on Win32 #51778 --- runtime/bin/eventhandler_win.cc | 29 ++++++++++++++++++++++++++++- runtime/bin/eventhandler_win.h | 15 +++++++++++++-- runtime/bin/socket_base_win.cc | 14 ++++++++++---- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc index 2af20b967fce..2c5fed73679a 100644 --- a/runtime/bin/eventhandler_win.cc +++ b/runtime/bin/eventhandler_win.cc @@ -455,6 +455,16 @@ bool ListenSocket::LoadAcceptEx() { return (status != SOCKET_ERROR); } +bool ListenSocket::LoadGetAcceptExSockaddrs() { + // Load the LoadGetAcceptExSockaddrs function into memory using WSAIoctl. + GUID guid_load_accept_ex_sockaddrs = WSAID_GETACCEPTEXSOCKADDRS; + DWORD bytes; + int status = WSAIoctl(socket(), SIO_GET_EXTENSION_FUNCTION_POINTER, + &guid_load_accept_ex_sockaddrs, sizeof(guid_load_accept_ex_sockaddrs), &GetAcceptExSockaddrs_, + sizeof(GetAcceptExSockaddrs_), &bytes, NULL, NULL); + return (status != SOCKET_ERROR); +} + bool ListenSocket::IssueAccept() { MonitorLocker ml(&monitor_); @@ -498,8 +508,21 @@ void ListenSocket::AcceptComplete(OverlappedBuffer* buffer, int rc = setsockopt(buffer->client(), SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, reinterpret_cast(&s), sizeof(s)); if (rc == NO_ERROR) { + LPSOCKADDR local_addr = 0; + int local_addr_length = 0; + LPSOCKADDR remote_addr = 0; + int remote_addr_length = 0; + static const int kAcceptExAddressAdditionalBytes = 16; + static const int kAcceptExAddressStorageSize = + sizeof(SOCKADDR_STORAGE) + kAcceptExAddressAdditionalBytes; + GetAcceptExSockaddrs_(buffer->GetBufferStart(), 0, kAcceptExAddressStorageSize, + kAcceptExAddressStorageSize, &local_addr, &local_addr_length, + &remote_addr, &remote_addr_length); + RawAddr* remote_addr_ = new RawAddr; + memcpy(remote_addr_, remote_addr, remote_addr_length); + // Insert the accepted socket into the list. - ClientSocket* client_socket = new ClientSocket(buffer->client()); + ClientSocket* client_socket = new ClientSocket(buffer->client(), remote_addr_); client_socket->mark_connected(); client_socket->CreateCompletionPort(completion_port); if (accepted_head_ == NULL) { @@ -559,6 +582,7 @@ void ListenSocket::DoClose() { // before EnsureInitialized was called, we have to reset the AcceptEx_ // function pointer. AcceptEx_ = NULL; + GetAcceptExSockaddrs_ = NULL; } bool ListenSocket::CanAccept() { @@ -603,6 +627,9 @@ void ListenSocket::EnsureInitialized( CreateCompletionPort(event_handler_->completion_port()); LoadAcceptEx(); } + if (GetAcceptExSockaddrs_ == NULL) { + LoadGetAcceptExSockaddrs(); + } } bool ListenSocket::IsClosed() { diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h index 67c8c5b21ebd..4dc7c6c09cf5 100644 --- a/runtime/bin/eventhandler_win.h +++ b/runtime/bin/eventhandler_win.h @@ -16,6 +16,7 @@ #include "bin/builtin.h" #include "bin/reference_counting.h" #include "bin/thread.h" +#include "bin/socket_base.h" namespace dart { namespace bin { @@ -387,6 +388,7 @@ class ListenSocket : public DescriptorInfoMultipleMixin { explicit ListenSocket(intptr_t s) : DescriptorInfoMultipleMixin(s, true), AcceptEx_(NULL), + GetAcceptExSockaddrs_(NULL), pending_accept_count_(0), accepted_head_(NULL), accepted_tail_(NULL), @@ -419,8 +421,12 @@ class ListenSocket : public DescriptorInfoMultipleMixin { private: bool LoadAcceptEx(); + bool LoadGetAcceptExSockaddrs(); + LPFN_ACCEPTEX AcceptEx_; + LPFN_GETACCEPTEXSOCKADDRS GetAcceptExSockaddrs_; + // The number of asynchronous `IssueAccept` operations which haven't completed // yet. int pending_accept_count_; @@ -440,12 +446,13 @@ class ListenSocket : public DescriptorInfoMultipleMixin { // Information on connected sockets. class ClientSocket : public DescriptorInfoSingleMixin { public: - explicit ClientSocket(intptr_t s) + explicit ClientSocket(intptr_t s, RawAddr* premote_addr = NULL) : DescriptorInfoSingleMixin(s, true), DisconnectEx_(NULL), next_(NULL), connected_(false), - closed_(false) { + closed_(false), + premote_addr_(premote_addr) { LoadDisconnectEx(); type_ = kClientSocket; } @@ -456,6 +463,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { ASSERT(!HasPendingWrite()); ASSERT(next_ == NULL); ASSERT(closed_ == true); + delete premote_addr_; } void Shutdown(int how); @@ -480,6 +488,8 @@ class ClientSocket : public DescriptorInfoSingleMixin { void mark_closed() { closed_ = true; } + RawAddr* const get_remote_addr() const { return premote_addr_;} + #if defined(DEBUG) static intptr_t disconnecting() { return disconnecting_; } #endif @@ -491,6 +501,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { ClientSocket* next_; bool connected_; bool closed_; + RawAddr* premote_addr_; #if defined(DEBUG) static intptr_t disconnecting_; diff --git a/runtime/bin/socket_base_win.cc b/runtime/bin/socket_base_win.cc index 07f6e71dead9..b820ffe7eaa6 100644 --- a/runtime/bin/socket_base_win.cc +++ b/runtime/bin/socket_base_win.cc @@ -181,10 +181,16 @@ intptr_t SocketBase::GetPort(intptr_t fd) { SocketAddress* SocketBase::GetRemotePeer(intptr_t fd, intptr_t* port) { ASSERT(reinterpret_cast(fd)->is_socket()); SocketHandle* socket_handle = reinterpret_cast(fd); - RawAddr raw; - socklen_t size = sizeof(raw); - if (getpeername(socket_handle->socket(), &raw.addr, &size)) { - return NULL; + RawAddr raw{}; + RawAddr* praw; + if(socket_handle->is_client_socket() && + (praw = reinterpret_cast(fd)->get_remote_addr())) { + memcpy(&raw, praw, SocketAddress::GetAddrLength(*praw)); + } else { + socklen_t size = sizeof(raw); + if (getpeername(socket_handle->socket(), &raw.addr, &size)) { + return NULL; + } } *port = SocketAddress::GetAddrPort(raw); // Clear the port before calling WSAAddressToString as WSAAddressToString From d50fff2bcd04ec902a5996058db322aa0aeb6862 Mon Sep 17 00:00:00 2001 From: Mihail Slobodyanuk Date: Thu, 27 Apr 2023 08:20:28 +0000 Subject: [PATCH 2/6] Code review --- runtime/bin/eventhandler_win.cc | 49 +++++++++++++++++---------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc index eb3ad0e8a398..a8de83e3ea1d 100644 --- a/runtime/bin/eventhandler_win.cc +++ b/runtime/bin/eventhandler_win.cc @@ -33,6 +33,14 @@ namespace bin { static constexpr int kBufferSize = 64 * 1024; static constexpr int kStdOverlappedBufferSize = 16 * 1024; static constexpr int kMaxUDPPackageLength = 64 * 1024; +// For AcceptEx there needs to be buffer storage for address +// information for two addresses (local and remote address). The +// AcceptEx documentation says: "This value must be at least 16 +// bytes more than the maximum address length for the transport +// protocol in use." +static constexpr int kAcceptExAddressAdditionalBytes = 16; +static constexpr int kAcceptExAddressStorageSize = + sizeof(SOCKADDR_STORAGE) + kAcceptExAddressAdditionalBytes; OverlappedBuffer* OverlappedBuffer::AllocateBuffer(int buffer_size, Operation operation) { @@ -459,23 +467,17 @@ bool ListenSocket::LoadGetAcceptExSockaddrs() { // Load the LoadGetAcceptExSockaddrs function into memory using WSAIoctl. GUID guid_load_accept_ex_sockaddrs = WSAID_GETACCEPTEXSOCKADDRS; DWORD bytes; - int status = WSAIoctl(socket(), SIO_GET_EXTENSION_FUNCTION_POINTER, - &guid_load_accept_ex_sockaddrs, sizeof(guid_load_accept_ex_sockaddrs), &GetAcceptExSockaddrs_, - sizeof(GetAcceptExSockaddrs_), &bytes, NULL, NULL); + int status = + WSAIoctl(socket(), SIO_GET_EXTENSION_FUNCTION_POINTER, + &guid_load_accept_ex_sockaddrs, + sizeof(guid_load_accept_ex_sockaddrs), &GetAcceptExSockaddrs_, + sizeof(GetAcceptExSockaddrs_), &bytes, nullptr, nullptr); return (status != SOCKET_ERROR); } bool ListenSocket::IssueAccept() { MonitorLocker ml(&monitor_); - // For AcceptEx there needs to be buffer storage for address - // information for two addresses (local and remote address). The - // AcceptEx documentation says: "This value must be at least 16 - // bytes more than the maximum address length for the transport - // protocol in use." - const int kAcceptExAddressAdditionalBytes = 16; - const int kAcceptExAddressStorageSize = - sizeof(SOCKADDR_STORAGE) + kAcceptExAddressAdditionalBytes; OverlappedBuffer* buffer = OverlappedBuffer::AllocateAcceptBuffer(2 * kAcceptExAddressStorageSize); DWORD received; @@ -508,21 +510,20 @@ void ListenSocket::AcceptComplete(OverlappedBuffer* buffer, int rc = setsockopt(buffer->client(), SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, reinterpret_cast(&s), sizeof(s)); if (rc == NO_ERROR) { - LPSOCKADDR local_addr = 0; - int local_addr_length = 0; - LPSOCKADDR remote_addr = 0; - int remote_addr_length = 0; - static const int kAcceptExAddressAdditionalBytes = 16; - static const int kAcceptExAddressStorageSize = - sizeof(SOCKADDR_STORAGE) + kAcceptExAddressAdditionalBytes; - GetAcceptExSockaddrs_(buffer->GetBufferStart(), 0, kAcceptExAddressStorageSize, + LPSOCKADDR local_addr; + int local_addr_length; + LPSOCKADDR remote_addr; + int remote_addr_length; + GetAcceptExSockaddrs_( + buffer->GetBufferStart(), 0, kAcceptExAddressStorageSize, kAcceptExAddressStorageSize, &local_addr, &local_addr_length, &remote_addr, &remote_addr_length); RawAddr* remote_addr_ = new RawAddr; memcpy(remote_addr_, remote_addr, remote_addr_length); // Insert the accepted socket into the list. - ClientSocket* client_socket = new ClientSocket(buffer->client(), remote_addr_); + ClientSocket* client_socket = + new ClientSocket(buffer->client(), remote_addr_); client_socket->mark_connected(); client_socket->CreateCompletionPort(completion_port); if (accepted_head_ == nullptr) { @@ -625,10 +626,12 @@ void ListenSocket::EnsureInitialized( ASSERT(event_handler_ == nullptr); event_handler_ = event_handler; CreateCompletionPort(event_handler_->completion_port()); - LoadAcceptEx(); + bool isLoaded = LoadAcceptEx(); + ASSERT(isLoaded); } - if (GetAcceptExSockaddrs_ == NULL) { - LoadGetAcceptExSockaddrs(); + if (GetAcceptExSockaddrs_ == nullptr) { + bool isLoaded = LoadGetAcceptExSockaddrs(); + ASSERT(isLoaded); } } From 3fa760197f68b46b8c687053167bc7972233002d Mon Sep 17 00:00:00 2001 From: Mihail Slobodyanuk Date: Mon, 1 May 2023 16:25:34 +0000 Subject: [PATCH 3/6] Code review --- runtime/bin/eventhandler_win.cc | 5 ++++- runtime/bin/eventhandler_win.h | 14 ++++++-------- runtime/bin/socket_base_win.cc | 10 ++++++---- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc index a8de83e3ea1d..59151340e075 100644 --- a/runtime/bin/eventhandler_win.cc +++ b/runtime/bin/eventhandler_win.cc @@ -510,6 +510,9 @@ void ListenSocket::AcceptComplete(OverlappedBuffer* buffer, int rc = setsockopt(buffer->client(), SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, reinterpret_cast(&s), sizeof(s)); if (rc == NO_ERROR) { + // getpeername() returns incorrect results when used with a socket that was + // accepted using overlapped I/O. AcceptEx includes the remote address in its + // result so retrieve it using GetAcceptExSockaddrs and save it. LPSOCKADDR local_addr; int local_addr_length; LPSOCKADDR remote_addr; @@ -581,7 +584,7 @@ void ListenSocket::DoClose() { } // To finish resetting the state of the ListenSocket back to what it was // before EnsureInitialized was called, we have to reset the AcceptEx_ - // function pointer. + // and GetAcceptExSockaddrs_ function pointer. AcceptEx_ = nullptr; GetAcceptExSockaddrs_ = nullptr; } diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h index 4cb927ce217a..4b5399e39a1b 100644 --- a/runtime/bin/eventhandler_win.h +++ b/runtime/bin/eventhandler_win.h @@ -15,8 +15,8 @@ #include "bin/builtin.h" #include "bin/reference_counting.h" -#include "bin/thread.h" #include "bin/socket_base.h" +#include "bin/thread.h" namespace dart { namespace bin { @@ -420,11 +420,9 @@ class ListenSocket : public DescriptorInfoMultipleMixin { private: bool LoadAcceptEx(); - bool LoadGetAcceptExSockaddrs(); LPFN_ACCEPTEX AcceptEx_; - LPFN_GETACCEPTEXSOCKADDRS GetAcceptExSockaddrs_; // The number of asynchronous `IssueAccept` operations which haven't completed @@ -446,13 +444,13 @@ class ListenSocket : public DescriptorInfoMultipleMixin { // Information on connected sockets. class ClientSocket : public DescriptorInfoSingleMixin { public: - explicit ClientSocket(intptr_t s, RawAddr* premote_addr = NULL) + explicit ClientSocket(intptr_t s, RawAddr* premote_addr = nullptr) : DescriptorInfoSingleMixin(s, true), DisconnectEx_(nullptr), next_(nullptr), connected_(false), closed_(false), - premote_addr_(premote_addr) { + remote_addr_(premote_addr) { LoadDisconnectEx(); type_ = kClientSocket; } @@ -463,7 +461,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { ASSERT(!HasPendingWrite()); ASSERT(next_ == nullptr); ASSERT(closed_ == true); - delete premote_addr_; + delete remote_addr_; } void Shutdown(int how); @@ -488,7 +486,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { void mark_closed() { closed_ = true; } - RawAddr* const get_remote_addr() const { return premote_addr_;} + RawAddr* const remote_addr() const { return remote_addr_; } #if defined(DEBUG) static intptr_t disconnecting() { return disconnecting_; } @@ -501,7 +499,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { ClientSocket* next_; bool connected_; bool closed_; - RawAddr* premote_addr_; + RawAddr* remote_addr_; #if defined(DEBUG) static intptr_t disconnecting_; diff --git a/runtime/bin/socket_base_win.cc b/runtime/bin/socket_base_win.cc index a5354e210baf..a97daf99af1b 100644 --- a/runtime/bin/socket_base_win.cc +++ b/runtime/bin/socket_base_win.cc @@ -183,10 +183,12 @@ SocketAddress* SocketBase::GetRemotePeer(intptr_t fd, intptr_t* port) { ASSERT(reinterpret_cast(fd)->is_socket()); SocketHandle* socket_handle = reinterpret_cast(fd); RawAddr raw{}; - RawAddr* praw; - if(socket_handle->is_client_socket() && - (praw = reinterpret_cast(fd)->get_remote_addr())) { - memcpy(&raw, praw, SocketAddress::GetAddrLength(*praw)); + RawAddr* cached_remote_addr; + if (socket_handle->is_client_socket() && + (cached_remote_addr = + reinterpret_cast(fd)->remote_addr())) { + memcpy(&raw, cached_remote_addr, + SocketAddress::GetAddrLength(*cached_remote_addr)); } else { socklen_t size = sizeof(raw); if (getpeername(socket_handle->socket(), &raw.addr, &size)) { From 1793144776bb19a2bcbd5d11d29d59b0a2c8229a Mon Sep 17 00:00:00 2001 From: Mihail Slobodyanuk Date: Wed, 10 May 2023 05:53:11 +0000 Subject: [PATCH 4/6] Code review --- runtime/bin/eventhandler_win.cc | 2 +- runtime/bin/eventhandler_win.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc index 59151340e075..dc0f3ea29c60 100644 --- a/runtime/bin/eventhandler_win.cc +++ b/runtime/bin/eventhandler_win.cc @@ -584,7 +584,7 @@ void ListenSocket::DoClose() { } // To finish resetting the state of the ListenSocket back to what it was // before EnsureInitialized was called, we have to reset the AcceptEx_ - // and GetAcceptExSockaddrs_ function pointer. + // and GetAcceptExSockaddrs_ function pointers. AcceptEx_ = nullptr; GetAcceptExSockaddrs_ = nullptr; } diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h index 4b5399e39a1b..9edbbb6f7cff 100644 --- a/runtime/bin/eventhandler_win.h +++ b/runtime/bin/eventhandler_win.h @@ -444,13 +444,13 @@ class ListenSocket : public DescriptorInfoMultipleMixin { // Information on connected sockets. class ClientSocket : public DescriptorInfoSingleMixin { public: - explicit ClientSocket(intptr_t s, RawAddr* premote_addr = nullptr) + explicit ClientSocket(intptr_t s, RawAddr* remote_addr = nullptr) : DescriptorInfoSingleMixin(s, true), DisconnectEx_(nullptr), next_(nullptr), connected_(false), closed_(false), - remote_addr_(premote_addr) { + remote_addr_(remote_addr) { LoadDisconnectEx(); type_ = kClientSocket; } From e3d278b614b6c355224d77662a522ec9865cfdc4 Mon Sep 17 00:00:00 2001 From: Mihail Slobodyanuk Date: Fri, 19 May 2023 10:39:09 +0000 Subject: [PATCH 5/6] Review --- runtime/bin/eventhandler_win.cc | 8 ++++---- runtime/bin/eventhandler_win.h | 5 ++--- runtime/bin/socket_base_win.cc | 17 ++++++++++------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc index dc0f3ea29c60..84c345263371 100644 --- a/runtime/bin/eventhandler_win.cc +++ b/runtime/bin/eventhandler_win.cc @@ -464,13 +464,13 @@ bool ListenSocket::LoadAcceptEx() { } bool ListenSocket::LoadGetAcceptExSockaddrs() { - // Load the LoadGetAcceptExSockaddrs function into memory using WSAIoctl. - GUID guid_load_accept_ex_sockaddrs = WSAID_GETACCEPTEXSOCKADDRS; + // Load the GetAcceptExSockaddrs function into memory using WSAIoctl. + GUID guid_get_accept_ex_sockaddrs = WSAID_GETACCEPTEXSOCKADDRS; DWORD bytes; int status = WSAIoctl(socket(), SIO_GET_EXTENSION_FUNCTION_POINTER, - &guid_load_accept_ex_sockaddrs, - sizeof(guid_load_accept_ex_sockaddrs), &GetAcceptExSockaddrs_, + &guid_get_accept_ex_sockaddrs, + sizeof(guid_get_accept_ex_sockaddrs), &GetAcceptExSockaddrs_, sizeof(GetAcceptExSockaddrs_), &bytes, nullptr, nullptr); return (status != SOCKET_ERROR); } diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h index 9edbbb6f7cff..1bba490edb7d 100644 --- a/runtime/bin/eventhandler_win.h +++ b/runtime/bin/eventhandler_win.h @@ -461,7 +461,6 @@ class ClientSocket : public DescriptorInfoSingleMixin { ASSERT(!HasPendingWrite()); ASSERT(next_ == nullptr); ASSERT(closed_ == true); - delete remote_addr_; } void Shutdown(int how); @@ -486,7 +485,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { void mark_closed() { closed_ = true; } - RawAddr* const remote_addr() const { return remote_addr_; } + RawAddr* const remote_addr() const { return remote_addr_.get(); } #if defined(DEBUG) static intptr_t disconnecting() { return disconnecting_; } @@ -499,7 +498,7 @@ class ClientSocket : public DescriptorInfoSingleMixin { ClientSocket* next_; bool connected_; bool closed_; - RawAddr* remote_addr_; + std::unique_ptr remote_addr_; #if defined(DEBUG) static intptr_t disconnecting_; diff --git a/runtime/bin/socket_base_win.cc b/runtime/bin/socket_base_win.cc index a97daf99af1b..9940d93deae6 100644 --- a/runtime/bin/socket_base_win.cc +++ b/runtime/bin/socket_base_win.cc @@ -182,18 +182,21 @@ intptr_t SocketBase::GetPort(intptr_t fd) { SocketAddress* SocketBase::GetRemotePeer(intptr_t fd, intptr_t* port) { ASSERT(reinterpret_cast(fd)->is_socket()); SocketHandle* socket_handle = reinterpret_cast(fd); - RawAddr raw{}; - RawAddr* cached_remote_addr; - if (socket_handle->is_client_socket() && - (cached_remote_addr = - reinterpret_cast(fd)->remote_addr())) { - memcpy(&raw, cached_remote_addr, - SocketAddress::GetAddrLength(*cached_remote_addr)); + RawAddr raw; + RawAddr* cached_remote_addr{}; + if (socket_handle->is_client_socket()) { + cached_remote_addr = reinterpret_cast(fd)->remote_addr(); + } + if(cached_remote_addr) { + raw = *cached_remote_addr; } else { socklen_t size = sizeof(raw); if (getpeername(socket_handle->socket(), &raw.addr, &size)) { return nullptr; } + if (!size) { + return nullptr; + } } *port = SocketAddress::GetAddrPort(raw); // Clear the port before calling WSAAddressToString as WSAAddressToString From 695f58c28925aedfc43bee9030147c371495b8f0 Mon Sep 17 00:00:00 2001 From: Mihail Slobodyanuk Date: Tue, 6 Jun 2023 06:09:19 +0000 Subject: [PATCH 6/6] Re-enabled io/socket_info_ipv6_test on Windows according to Brian Quinlan request --- tests/standalone/standalone_vm.status | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/standalone/standalone_vm.status b/tests/standalone/standalone_vm.status index aad7ab90feea..d066b888a330 100644 --- a/tests/standalone/standalone_vm.status +++ b/tests/standalone/standalone_vm.status @@ -42,7 +42,6 @@ io/socket_upgrade_to_secure_test: Skip # Issue 27638 [ $system == windows ] io/process_sync_test: Pass, Timeout # Issue 24596 io/sleep_test: Pass, Fail # Issue 25757 -io/socket_info_ipv6_test: Skip verbose_gc_to_bmu_test: Skip [ $arch == arm && $mode == release && $runtime == dart_precompiled && $system == android ]