From 11bb74a8478e72b45111993bb1937f265450e95e Mon Sep 17 00:00:00 2001 From: Alex Fabijanic Date: Wed, 9 Jun 2021 07:12:55 +0200 Subject: [PATCH] fix(HostEntry): DNS HostEntry returns multiple entries #3303 --- Net/include/Poco/Net/HostEntry.h | 8 ++++++++ Net/src/HostEntry.cpp | 8 ++++++-- Net/testsuite/src/DNSTest.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Net/include/Poco/Net/HostEntry.h b/Net/include/Poco/Net/HostEntry.h index dca048f83..e07d63924 100644 --- a/Net/include/Poco/Net/HostEntry.h +++ b/Net/include/Poco/Net/HostEntry.h @@ -76,6 +76,14 @@ public: /// for the host. private: + template + void removeDuplicates(C& list) + { + std::sort(list.begin(), list.end()); + auto last = std::unique(list.begin(), list.end()); + list.erase(last, list.end()); + } + std::string _name; AliasList _aliases; AddressList _addresses; diff --git a/Net/src/HostEntry.cpp b/Net/src/HostEntry.cpp index 3257c7031..a93deb564 100644 --- a/Net/src/HostEntry.cpp +++ b/Net/src/HostEntry.cpp @@ -25,11 +25,11 @@ HostEntry::HostEntry() { } - + HostEntry::HostEntry(struct hostent* entry) { poco_check_ptr (entry); - + _name = entry->h_name; char** alias = entry->h_aliases; if (alias) @@ -40,6 +40,8 @@ HostEntry::HostEntry(struct hostent* entry) ++alias; } } + removeDuplicates(_aliases); + char** address = entry->h_addr_list; if (address) { @@ -49,6 +51,7 @@ HostEntry::HostEntry(struct hostent* entry) ++address; } } + removeDuplicates(_addresses); } @@ -80,6 +83,7 @@ HostEntry::HostEntry(struct addrinfo* ainfo) } } } + removeDuplicates(_addresses); } diff --git a/Net/testsuite/src/DNSTest.cpp b/Net/testsuite/src/DNSTest.cpp index 5d3c8d662..9f442edcc 100644 --- a/Net/testsuite/src/DNSTest.cpp +++ b/Net/testsuite/src/DNSTest.cpp @@ -88,6 +88,17 @@ void DNSTest::testHostByAddress() void DNSTest::testResolve() { + HostEntry he1 = DNS::hostByName("localhost"); + + auto a = he1.addresses(); + sort(a.begin(), a.end()); + auto itA = std::unique(a.begin(), a.end()); + assertTrue (itA == a.end()); + + auto b = he1.aliases(); + sort(b.begin(), b.end()); + auto itB = std::unique(b.begin(), b.end()); + assertTrue (itB == b.end()); }