Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 12 additions & 14 deletions source/common/network/io_socket_handle_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -587,11 +587,19 @@ absl::optional<std::string> IoSocketHandleImpl::interfaceName() {
return absl::nullopt;
}

if (socket_address->ip()->version() != Address::IpVersion::v4 &&
socket_address->ip()->version() != Address::IpVersion::v6) {
ENVOY_BUG(false, fmt::format("unexpected IP family {}", socket_address->ip()->version()));
}

Api::InterfaceAddressVector interface_addresses{};
const Api::SysCallIntResult rc = os_syscalls_singleton.getifaddrs(interface_addresses);
RELEASE_ASSERT(!rc.return_value_, fmt::format("getiffaddrs error: {}", rc.errno_));

absl::optional<std::string> selected_interface_name{};
absl::uint128 socket_address_value = socket_address->ip()->version() == Address::IpVersion::v4
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the prior version would return an empty interface name but I think falling through here might segfault instead. Maybe add a unit test?

? socket_address->ip()->ipv4()->address()
: socket_address->ip()->ipv6()->address();
for (const auto& interface_address : interface_addresses) {
if (!interface_address.interface_addr_) {
continue;
Expand All @@ -600,20 +608,10 @@ absl::optional<std::string> IoSocketHandleImpl::interfaceName() {
if (socket_address->ip()->version() == interface_address.interface_addr_->ip()->version()) {
// Compare address _without port_.
// TODO: create common addressAsStringWithoutPort method to simplify code here.
absl::uint128 socket_address_value;
absl::uint128 interface_address_value;
switch (socket_address->ip()->version()) {
case Address::IpVersion::v4:
socket_address_value = socket_address->ip()->ipv4()->address();
interface_address_value = interface_address.interface_addr_->ip()->ipv4()->address();
break;
case Address::IpVersion::v6:
socket_address_value = socket_address->ip()->ipv6()->address();
interface_address_value = interface_address.interface_addr_->ip()->ipv6()->address();
break;
default:
ENVOY_BUG(false, fmt::format("unexpected IP family {}", socket_address->ip()->version()));
}
absl::uint128 interface_address_value =
interface_address.interface_addr_->ip()->version() == Address::IpVersion::v4
? interface_address.interface_addr_->ip()->ipv4()->address()
: interface_address.interface_addr_->ip()->ipv6()->address();

if (socket_address_value == interface_address_value) {
selected_interface_name = interface_address.interface_name_;
Expand Down