Kaydet (Commit) e5aa36f4 authored tarafından Arkadiy Illarionov's avatar Arkadiy Illarionov Kaydeden (comit) Stephan Bergmann

Replace gethostbyname_r with getaddrinfo

The gethostbyname*() functions are obsolete.

Change-Id: I14a55eba3f111a3280f23955ffd86843079c7e75
Reviewed-on: https://gerrit.libreoffice.org/69337
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst 74907a1f
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
#define OSL_INVALID_SOCKET -1 #define OSL_INVALID_SOCKET -1
#define OSL_SOCKET_ERROR -1 #define OSL_SOCKET_ERROR -1
/* Buffer size for gethostbyname */ /* Buffer size for getnameinfo */
#define MAX_HOSTBUFFER_SIZE 2048 #define MAX_HOSTBUFFER_SIZE 2048
static const unsigned long FamilyMap[]= { static const unsigned long FamilyMap[]= {
...@@ -558,26 +558,38 @@ oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Seque ...@@ -558,26 +558,38 @@ oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Seque
instead! instead!
*/ */
/* wrap around different interfaces to reentrant gethostbyname */ namespace {
static struct hostent* osl_gethostbyname_r (
const char *name, struct hostent *result, struct oslAddrInfo
char *buffer, int buflen, int *h_errnop) {
{ addrinfo* pAddrInfoList = nullptr;
#if defined(LINUX) || defined(ANDROID) || defined(FREEBSD) || defined(DRAGONFLY) int nError;
struct hostent *result_; /* will be the same as result */
int e; oslAddrInfo(const char* name, bool isInet = false)
e = gethostbyname_r (name, result, buffer, buflen, {
&result_, h_errnop); addrinfo aHints;
return e ? nullptr : result_ ; memset(&aHints, 0, sizeof(addrinfo));
#elif defined(AIX) if (isInet)
*h_errnop = gethostbyname_r (name, result, (struct hostent_data *)buffer); aHints.ai_family = AF_INET;
(void)buflen; aHints.ai_flags = AI_CANONNAME;
return *h_errnop ? NULL : result ;
#else nError = getaddrinfo(name, nullptr, &aHints, &pAddrInfoList);
return gethostbyname_r( name, result, buffer, buflen, h_errnop); }
#endif
} ~oslAddrInfo()
{
if (nError == 0)
freeaddrinfo(pAddrInfoList);
}
const char* getHostName()
{
assert(pAddrInfoList);
return pAddrInfoList->ai_canonname;
}
};
}
static bool isFullQualifiedDomainName (const sal_Char *pHostName) static bool isFullQualifiedDomainName (const sal_Char *pHostName)
{ {
/* a FQDN (aka 'hostname.domain.top_level_domain' ) /* a FQDN (aka 'hostname.domain.top_level_domain' )
...@@ -597,19 +609,9 @@ static sal_Char* getFullQualifiedDomainName (const sal_Char *pHostName) ...@@ -597,19 +609,9 @@ static sal_Char* getFullQualifiedDomainName (const sal_Char *pHostName)
} }
else else
{ {
struct hostent aHostByName; oslAddrInfo aAddrInfo(pHostName);
struct hostent *pHostByName; if (aAddrInfo.nError == 0)
sal_Char pQualifiedHostBuffer[ MAX_HOSTBUFFER_SIZE ]; pFullQualifiedName = strdup(aAddrInfo.getHostName());
int nErrorNo;
pHostByName = osl_gethostbyname_r (
pHostName,
&aHostByName, pQualifiedHostBuffer,
sizeof(pQualifiedHostBuffer), &nErrorNo );
if (pHostByName != nullptr)
{
pFullQualifiedName = strdup(pHostByName->h_name);
}
} }
return pFullQualifiedName; return pFullQualifiedName;
...@@ -621,22 +623,17 @@ struct oslHostAddrImpl ...@@ -621,22 +623,17 @@ struct oslHostAddrImpl
oslSocketAddr pSockAddr; oslSocketAddr pSockAddr;
}; };
static oslHostAddr hostentToHostAddr (const struct hostent *he) static oslHostAddr addrinfoToHostAddr (const addrinfo* ai)
{ {
oslHostAddr pAddr= nullptr; if (!ai || !ai->ai_canonname || !ai->ai_addr)
oslSocketAddr pSockAddr = nullptr;
sal_Char *cn;
if ((he == nullptr) || (he->h_name == nullptr) || (he->h_addr_list[0] == nullptr))
return nullptr; return nullptr;
cn = getFullQualifiedDomainName (he->h_name); sal_Char* cn = getFullQualifiedDomainName(ai->ai_canonname);
SAL_WARN_IF( !cn, "sal.osl", "couldn't get full qualified domain name" ); SAL_WARN_IF( !cn, "sal.osl", "couldn't get full qualified domain name" );
if (cn == nullptr) if (cn == nullptr)
return nullptr; return nullptr;
pSockAddr = createSocketAddr(); oslSocketAddr pSockAddr = createSocketAddr();
SAL_WARN_IF( !pSockAddr, "sal.osl", "insufficient memory" ); SAL_WARN_IF( !pSockAddr, "sal.osl", "insufficient memory" );
if (pSockAddr == nullptr) if (pSockAddr == nullptr)
{ {
...@@ -644,14 +641,12 @@ static oslHostAddr hostentToHostAddr (const struct hostent *he) ...@@ -644,14 +641,12 @@ static oslHostAddr hostentToHostAddr (const struct hostent *he)
return nullptr; return nullptr;
} }
pSockAddr->m_sockaddr.sa_family= he->h_addrtype; if (ai->ai_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
if (pSockAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
{ {
struct sockaddr_in *sin= reinterpret_cast<sockaddr_in *>(&pSockAddr->m_sockaddr);
memcpy ( memcpy (
&(sin->sin_addr.s_addr), &(pSockAddr->m_sockaddr),
he->h_addr_list[0], ai->ai_addr,
he->h_length); ai->ai_addrlen);
} }
else else
{ {
...@@ -665,7 +660,7 @@ static oslHostAddr hostentToHostAddr (const struct hostent *he) ...@@ -665,7 +660,7 @@ static oslHostAddr hostentToHostAddr (const struct hostent *he)
return nullptr; return nullptr;
} }
pAddr= static_cast<oslHostAddr>(malloc(sizeof(struct oslHostAddrImpl))); oslHostAddr pAddr = static_cast<oslHostAddr>(malloc(sizeof(struct oslHostAddrImpl)));
SAL_WARN_IF( !pAddr, "sal.osl", "allocation error" ); SAL_WARN_IF( !pAddr, "sal.osl", "allocation error" );
if (pAddr == nullptr) if (pAddr == nullptr)
{ {
...@@ -767,17 +762,9 @@ oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *ustrHostname) ...@@ -767,17 +762,9 @@ oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *ustrHostname)
oslHostAddr osl_psz_createHostAddrByName (const sal_Char *pszHostname) oslHostAddr osl_psz_createHostAddrByName (const sal_Char *pszHostname)
{ {
struct hostent aHe; oslAddrInfo aAddrInfo(pszHostname, /* isInet */ true);
struct hostent *pHe;
sal_Char heBuffer[ MAX_HOSTBUFFER_SIZE ];
int nErrorNo;
pHe = osl_gethostbyname_r (
pszHostname,
&aHe, heBuffer,
sizeof(heBuffer), &nErrorNo );
return hostentToHostAddr (pHe); return addrinfoToHostAddr (aAddrInfo.pAddrInfoList);
} }
oslHostAddr SAL_CALL osl_createHostAddrByAddr (const oslSocketAddr pAddr) oslHostAddr SAL_CALL osl_createHostAddrByAddr (const oslSocketAddr pAddr)
......
...@@ -50,95 +50,6 @@ static pthread_mutex_t getrtl_mutex = PTHREAD_MUTEX_INITIALIZER; ...@@ -50,95 +50,6 @@ static pthread_mutex_t getrtl_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif //defined(MACOSX) #endif //defined(MACOSX)
extern int h_errno;
struct hostent *gethostbyname_r(const char *name, struct hostent *result,
char *buffer, size_t buflen, int *h_errnop)
{
/* buffer layout: name\0
* array_of_pointer_to_aliases
* NULL
* alias1\0...aliasn\0
* array_of_pointer_to_addresses
* NULL
* addr1addr2addr3...addrn
*/
struct hostent* res;
RTL_MUTEX_LOCK
if ( (res = gethostbyname(name)) )
{
int nname, naliases, naddr_list, naliasesdata;
char **p, **parray, *data;
/* Check buffer size before copying, we want to leave the
* buffers unmodified in case something goes wrong.
*
* Is this required?
*/
nname= strlen(res->h_name)+1;
naliases = naddr_list = naliasesdata = 0;
for ( p = res->h_aliases; *p != nullptr; p++) {
naliases++;
naliasesdata += strlen(*p)+1;
}
for ( p = res->h_addr_list; *p != nullptr; p++)
naddr_list++;
if ( nname
+ (naliases+1)*sizeof(char*) + naliasesdata
+ (naddr_list+1)*sizeof(char*) + naddr_list*res->h_length
<= buflen )
{
memcpy(result, res, sizeof(struct hostent));
strcpy(buffer, res->h_name);
result->h_name = buffer;
buffer += nname;
parray = reinterpret_cast<char**>(buffer);
result->h_aliases = parray;
data = buffer + (naliases+1)*sizeof(char*);
for ( p = res->h_aliases; *p != nullptr; p++) {
int n = strlen(*p)+1;
*parray++ = data;
memcpy(data, *p, n);
data += n;
}
*parray = nullptr;
buffer = data;
parray = reinterpret_cast<char**>(buffer);
result->h_addr_list = parray;
data = buffer + (naddr_list+1)*sizeof(char*);
for ( p = res->h_addr_list; *p != nullptr; p++) {
*parray++ = data;
memcpy(data, *p, res->h_length);
data += res->h_length;
}
*parray = nullptr;
res = result;
}
else
{
errno = ERANGE;
res = nullptr;
}
}
else
{
*h_errnop = h_errno;
}
RTL_MUTEX_UNLOCK
return res;
}
#endif // OSX || IOS || OPENBSD || NETBSD #endif // OSX || IOS || OPENBSD || NETBSD
#if defined(MACOSX) #if defined(MACOSX)
......
...@@ -376,8 +376,6 @@ extern struct spwd *getspnam_r(const char *name, struct spwd *result, ...@@ -376,8 +376,6 @@ extern struct spwd *getspnam_r(const char *name, struct spwd *result,
struct tm *localtime_r(const time_t *timep, struct tm *buffer); struct tm *localtime_r(const time_t *timep, struct tm *buffer);
struct tm *gmtime_r(const time_t *timep, struct tm *buffer); struct tm *gmtime_r(const time_t *timep, struct tm *buffer);
#endif #endif
struct hostent *gethostbyname_r(const char *name, struct hostent *result,
char *buffer, size_t buflen, int *h_errnop);
#endif /* !defined(FREEBSD) */ #endif /* !defined(FREEBSD) */
#endif #endif
......
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