Commit a45eee72 authored by Eli Lindsey's avatar Eli Lindsey Committed by Facebook Github Bot

replace getnameinfo with inet_ntop in v6 string formatting

Summary: Some implementations of getnameinfo are triggering reverse DNS lookups despite us specifying NI_NUMERICHOST. Avoid all that by instead producing our string representations of v6 addresses manually via inet_ntop and if_indextoname.

Reviewed By: yangchi

Differential Revision: D5415477

fbshipit-source-id: 67853a85db6517d374d94c8261e56400f4c00fc5
parent 46a851f4
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <ostream> #include <ostream>
#include <string> #include <string>
#include <net/if.h>
#include <folly/Format.h> #include <folly/Format.h>
#include <folly/IPAddress.h> #include <folly/IPAddress.h>
#include <folly/IPAddressV4.h> #include <folly/IPAddressV4.h>
...@@ -403,30 +405,36 @@ IPAddressV6 IPAddressV6::mask(size_t numBits) const { ...@@ -403,30 +405,36 @@ IPAddressV6 IPAddressV6::mask(size_t numBits) const {
// public // public
string IPAddressV6::str() const { string IPAddressV6::str() const {
char buffer[INET6_ADDRSTRLEN] = {0}; char buffer[INET6_ADDRSTRLEN + IFNAMSIZ + 1];
sockaddr_in6 sock = toSockAddr();
int error = getnameinfo( if (!inet_ntop(AF_INET6, toAddr().s6_addr, buffer, INET6_ADDRSTRLEN)) {
(sockaddr*)&sock,
sizeof(sock),
buffer,
INET6_ADDRSTRLEN,
nullptr,
0,
NI_NUMERICHOST);
if (!error) {
string ip(buffer);
return ip;
} else {
throw IPAddressFormatException(to<std::string>( throw IPAddressFormatException(to<std::string>(
"Invalid address with hex ", "Invalid address with hex ",
"'", "'",
detail::Bytes::toHex(bytes(), 16), detail::Bytes::toHex(bytes(), 16),
"%",
sock.sin6_scope_id,
"'", "'",
" , with error ", " with error ",
gai_strerror(error))); strerror(errno)));
} }
auto scopeId = getScopeId();
if (scopeId != 0) {
auto len = strlen(buffer);
buffer[len] = '%';
if (!if_indextoname(scopeId, buffer + len + 1)) {
throw IPAddressFormatException(to<std::string>(
"Invalid scope for address with hex ",
"'",
detail::Bytes::toHex(bytes(), 16),
"%",
scopeId,
"'",
" with error ",
strerror(errno)));
}
}
return string(buffer);
} }
// public // public
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment