From 87a713365925ff62b996d78b08e99cdd36695206 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 21 May 2021 08:17:54 +0300 Subject: [PATCH] Add a test and fix the code --- src/Common/isLocalAddress.cpp | 17 +++++++---------- src/Common/tests/gtest_local_address.cpp | 23 ++++++++++++++++++++++- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/Common/isLocalAddress.cpp b/src/Common/isLocalAddress.cpp index 2a76241300c..fba92f5d763 100644 --- a/src/Common/isLocalAddress.cpp +++ b/src/Common/isLocalAddress.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -95,17 +96,13 @@ bool isLocalAddress(const Poco::Net::IPAddress & address) { if (address.family() == Poco::Net::AddressFamily::IPv4) { - union - { - UInt32 word; - unsigned char digits[4]; - } digits_union; + using Digits = std::array; + Digits digits = unalignedLoad(address.addr()); /// The address is located in memory in big endian form. - digits_union.word = ntohl(unalignedLoad(address.addr())); - if (digits_union.digits[0] == 127 - && digits_union.digits[1] <= 1 - && digits_union.digits[2] <= 1 - && digits_union.digits[3] <= 1) + if (digits[0] == 127 + && digits[1] <= 1 + && digits[2] <= 1 + && digits[3] <= 1) { return true; } diff --git a/src/Common/tests/gtest_local_address.cpp b/src/Common/tests/gtest_local_address.cpp index 504fba19713..47824a7fa27 100644 --- a/src/Common/tests/gtest_local_address.cpp +++ b/src/Common/tests/gtest_local_address.cpp @@ -11,9 +11,30 @@ TEST(LocalAddress, SmokeTest) std::string address_str; DB::readString(address_str, cmd->out); cmd->wait(); - std::cerr << "Got Address:" << address_str << std::endl; + std::cerr << "Got Address: " << address_str << std::endl; Poco::Net::IPAddress address(address_str); EXPECT_TRUE(DB::isLocalAddress(address)); } + +TEST(LocalAddress, Localhost) +{ + EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.0.0.1"})); + EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.0.1.1"})); + EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.1.1.1"})); + EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.1.0.1"})); + EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.1.0.0"})); + EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"::1"})); + + /// Make sure we don't mess with the byte order. + EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"1.0.0.127"})); + EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"1.1.1.127"})); + + EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"0.0.0.0"})); + EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"::"})); + EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"::2"})); + + /// The the comment in the implementation of isLocalAddress. + EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"127.0.0.2"})); +}