diff --git a/src/common/pick_address.cc b/src/common/pick_address.cc index 2fd076808ac..c92f2c4bc02 100644 --- a/src/common/pick_address.cc +++ b/src/common/pick_address.cc @@ -638,15 +638,24 @@ bool is_addr_in_subnet( { const auto nets = get_str_list(networks); ceph_assert(!nets.empty()); - const auto &net = nets.front(); - struct ifaddrs ifa; + unsigned ipv = CEPH_PICK_ADDRESS_IPV4; struct sockaddr_in public_addr; - - ifa.ifa_next = nullptr; - ifa.ifa_addr = (struct sockaddr*)&public_addr; public_addr.sin_family = AF_INET; - inet_pton(AF_INET, addr.c_str(), &public_addr.sin_addr); - return matches_with_net(cct, ifa, net, ipv); + if(inet_pton(AF_INET, addr.c_str(), &public_addr.sin_addr) != 1) { + lderr(cct) << "unable to convert chosen address to string: " << addr << dendl; + return false; + } + + for (const auto &net : nets) { + struct ifaddrs ifa; + memset(&ifa, 0, sizeof(ifa)); + ifa.ifa_next = nullptr; + ifa.ifa_addr = (struct sockaddr*)&public_addr; + if(matches_with_net(cct, ifa, net, ipv)) { + return true; + } + } + return false; }