From e352e896cb854759a2991b9f86389d7b01cf52a1 Mon Sep 17 00:00:00 2001 From: Yijie Ma Date: Thu, 14 Nov 2024 12:07:29 -0800 Subject: [PATCH] [c-ares] Fix inverted length check in GrpcPolledFdWindows (#38101) Fix https://github.com/grpc/grpc/issues/37969. There is an inverted length check in GrpcPolledFdWindows before memcpying from gRPC's `recv_from_source_addr_` into c-ares' socket address structure. In newer c-ares version, it changed to use `struct sockaddr_storage` for the socket address which is 128 bytes and hit this issue. Closes #38101 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38101 from yijiem:37969 282fc8269e4a65625463e0e64d7ee80e3b3216ea PiperOrigin-RevId: 696607100 --- src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc | 2 +- src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc b/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc index 3bfd15537e61b..0d4dcd5579ef4 100644 --- a/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +++ b/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc @@ -224,7 +224,7 @@ class GrpcPolledFdWindows : public GrpcPolledFd { // c-ares overloads this recv_from virtual socket function to receive // data on both UDP and TCP sockets, and from is nullptr for TCP. if (from != nullptr) { - CHECK(*from_len <= recv_from_source_addr_len_); + CHECK(*from_len >= recv_from_source_addr_len_); memcpy(from, &recv_from_source_addr_, recv_from_source_addr_len_); *from_len = recv_from_source_addr_len_; } diff --git a/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index 6f988c8710db4..f30826bbb43dc 100644 --- a/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -307,7 +307,7 @@ class GrpcPolledFdWindows final : public GrpcPolledFd { // c-ares overloads this recv_from virtual socket function to receive // data on both UDP and TCP sockets, and from is nullptr for TCP. if (from != nullptr) { - CHECK(*from_len <= recv_from_source_addr_len_); + CHECK(*from_len >= recv_from_source_addr_len_); memcpy(from, &recv_from_source_addr_, recv_from_source_addr_len_); *from_len = recv_from_source_addr_len_; }