os: if getaddrinfo() is available, use it, even if IPv6 support is disabled

Support for using getaddrinfo() was originally added to support IPv6,
and only used if IPv6 support was enabled.  Two decades later, support
for getaddrinfo() is ubiquitous and OS'es have marked gethostbyname()
as deprecated, so use the modern interface whenever we can now.

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1760>
This commit is contained in:
Alan Coopersmith 2025-01-12 10:45:01 -08:00 committed by Marge Bot
parent 5397854877
commit 2ffe0f8a35
4 changed files with 39 additions and 21 deletions

View File

@ -146,6 +146,7 @@ conf_data.set('HAVE_GETUID', cc.has_function('getuid') ? '1' : false)
conf_data.set('HAVE_GETEUID', cc.has_function('geteuid') ? '1' : false) conf_data.set('HAVE_GETEUID', cc.has_function('geteuid') ? '1' : false)
conf_data.set('HAVE_ISASTREAM', cc.has_function('isastream') ? '1' : false) conf_data.set('HAVE_ISASTREAM', cc.has_function('isastream') ? '1' : false)
conf_data.set('HAVE_ISSETUGID', cc.has_function('issetugid') ? '1' : false) conf_data.set('HAVE_ISSETUGID', cc.has_function('issetugid') ? '1' : false)
conf_data.set('HAVE_GETADDRINFO', cc.has_function('getaddrinfo') ? '1' : false)
conf_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs') ? '1' : false) conf_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs') ? '1' : false)
conf_data.set('HAVE_GETPEEREID', cc.has_function('getpeereid') ? '1' : false) conf_data.set('HAVE_GETPEEREID', cc.has_function('getpeereid') ? '1' : false)
conf_data.set('HAVE_GETPEERUCRED', cc.has_function('getpeerucred') ? '1' : false) conf_data.set('HAVE_GETPEERUCRED', cc.has_function('getpeerucred') ? '1' : false)

View File

@ -970,8 +970,11 @@ ResetHosts(const char *display)
else else
#if defined(TCPCONN) #if defined(TCPCONN)
{ {
#if defined(HAVE_GETADDRINFO)
if ((family == FamilyInternet) ||
#if defined(IPv6) #if defined(IPv6)
if ((family == FamilyInternet) || (family == FamilyInternet6) || (family == FamilyInternet6) ||
#endif
(family == FamilyWild)) { (family == FamilyWild)) {
struct addrinfo *addresses; struct addrinfo *addresses;
struct addrinfo *a; struct addrinfo *a;
@ -990,7 +993,7 @@ ResetHosts(const char *display)
freeaddrinfo(addresses); freeaddrinfo(addresses);
} }
} }
#else #else /* HAVE_GETADDRINFO */
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS #ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams; _Xgethostbynameparams hparams;
#endif #endif
@ -1017,7 +1020,7 @@ ResetHosts(const char *display)
#endif #endif
} }
} }
#endif /* IPv6 */ #endif /* HAVE_GETADDRINFO */
} }
#endif /* TCPCONN */ #endif /* TCPCONN */
family = FamilyWild; family = FamilyWild;
@ -1765,8 +1768,12 @@ siHostnameAddrMatch(int family, void *addr, int len,
* support for other address families, such as DECnet, could be added if * support for other address families, such as DECnet, could be added if
* desired. * desired.
*/ */
#if defined(HAVE_GETADDRINFO)
if ((family == FamilyInternet)
#if defined(IPv6) #if defined(IPv6)
if ((family == FamilyInternet) || (family == FamilyInternet6)) { || (family == FamilyInternet6)
#endif
) {
char hostname[SI_HOSTNAME_MAXLEN]; char hostname[SI_HOSTNAME_MAXLEN];
struct addrinfo *addresses; struct addrinfo *addresses;
struct addrinfo *a; struct addrinfo *a;
@ -1791,7 +1798,7 @@ siHostnameAddrMatch(int family, void *addr, int len,
freeaddrinfo(addresses); freeaddrinfo(addresses);
} }
} }
#else /* IPv6 not supported, use gethostbyname instead for IPv4 */ #else /* getaddrinfo not supported, use gethostbyname instead for IPv4 */
if (family == FamilyInternet) { if (family == FamilyInternet) {
register struct hostent *hp; register struct hostent *hp;

View File

@ -887,7 +887,7 @@ set_font_authorizations(char **authorizations, int *authlen, void *client)
char hname[1024], *hnameptr; char hname[1024], *hnameptr;
unsigned int len; unsigned int len;
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
struct addrinfo hints, *ai = NULL; struct addrinfo hints, *ai = NULL;
#else #else
struct hostent *host; struct hostent *host;
@ -898,7 +898,7 @@ set_font_authorizations(char **authorizations, int *authlen, void *client)
#endif #endif
gethostname(hname, 1024); gethostname(hname, 1024);
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_CANONNAME; hints.ai_flags = AI_CANONNAME;
if (getaddrinfo(hname, NULL, &hints, &ai) == 0) { if (getaddrinfo(hname, NULL, &hints, &ai) == 0) {
@ -928,7 +928,7 @@ set_font_authorizations(char **authorizations, int *authlen, void *client)
p += sizeof(AUTHORIZATION_NAME); p += sizeof(AUTHORIZATION_NAME);
memcpy(p, hnameptr, len); memcpy(p, hnameptr, len);
p += len; p += len;
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
if (ai) { if (ai) {
freeaddrinfo(ai); freeaddrinfo(ai);
} }

View File

@ -89,10 +89,12 @@ static char *xdmAuthCookie;
static XdmcpBuffer buffer; static XdmcpBuffer buffer;
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
static struct addrinfo *mgrAddr; static struct addrinfo *mgrAddr;
static struct addrinfo *mgrAddrFirst; static struct addrinfo *mgrAddrFirst;
#endif
#if defined(IPv6)
#define SOCKADDR_TYPE struct sockaddr_storage #define SOCKADDR_TYPE struct sockaddr_storage
#define SOCKADDR_FAMILY(s) ((struct sockaddr *)&(s))->sa_family #define SOCKADDR_FAMILY(s) ((struct sockaddr *)&(s))->sa_family
@ -836,15 +838,19 @@ timeout(void)
return; return;
} }
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
if (state == XDM_COLLECT_QUERY || state == XDM_COLLECT_INDIRECT_QUERY) { if (state == XDM_COLLECT_QUERY || state == XDM_COLLECT_INDIRECT_QUERY) {
/* Try next address */ /* Try next address */
for (mgrAddr = mgrAddr->ai_next;; mgrAddr = mgrAddr->ai_next) { for (mgrAddr = mgrAddr->ai_next;; mgrAddr = mgrAddr->ai_next) {
if (mgrAddr == NULL) { if (mgrAddr == NULL) {
mgrAddr = mgrAddrFirst; mgrAddr = mgrAddrFirst;
} }
if (mgrAddr->ai_family == AF_INET || mgrAddr->ai_family == AF_INET6) if (mgrAddr->ai_family == AF_INET)
break; break;
#if defined(IPv6)
if (mgrAddr->ai_family == AF_INET6)
break;
#endif
} }
#ifndef SIN6_LEN #ifndef SIN6_LEN
ManagerAddressLen = mgrAddr->ai_addrlen; ManagerAddressLen = mgrAddr->ai_addrlen;
@ -1351,12 +1357,12 @@ get_addr_by_name(const char *argtype,
const char *namestr, const char *namestr,
int port, int port,
int socktype, SOCKADDR_TYPE * addr, SOCKLEN_TYPE * addrlen int socktype, SOCKADDR_TYPE * addr, SOCKLEN_TYPE * addrlen
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
, struct addrinfo **aip, struct addrinfo **aifirstp , struct addrinfo **aip, struct addrinfo **aifirstp
#endif #endif
) )
{ {
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
struct addrinfo *ai; struct addrinfo *ai;
struct addrinfo hints; struct addrinfo hints;
char portstr[6]; char portstr[6];
@ -1383,8 +1389,12 @@ get_addr_by_name(const char *argtype,
if ((gaierr = getaddrinfo(namestr, pport, &hints, aifirstp)) == 0) { if ((gaierr = getaddrinfo(namestr, pport, &hints, aifirstp)) == 0) {
for (ai = *aifirstp; ai != NULL; ai = ai->ai_next) { for (ai = *aifirstp; ai != NULL; ai = ai->ai_next) {
if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) if (ai->ai_family == AF_INET)
break; break;
#if defined(IPv6)
if (ai->ai_family == AF_INET6)
break;
#endif
} }
if ((ai == NULL) || (ai->ai_addrlen > sizeof(SOCKADDR_TYPE))) { if ((ai == NULL) || (ai->ai_addrlen > sizeof(SOCKADDR_TYPE))) {
FatalError("Xserver: %s host %s not on supported network type\n", FatalError("Xserver: %s host %s not on supported network type\n",
@ -1400,7 +1410,7 @@ get_addr_by_name(const char *argtype,
FatalError("Xserver: %s: %s %s\n", gai_strerror(gaierr), argtype, FatalError("Xserver: %s: %s %s\n", gai_strerror(gaierr), argtype,
namestr); namestr);
} }
#else #else /* HAVE_GETADDRINFO */
struct hostent *hep; struct hostent *hep;
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS #ifdef XTHREADS_NEEDS_BYNAMEPARAMS
@ -1422,7 +1432,7 @@ get_addr_by_name(const char *argtype,
FatalError("Xserver: %s host on strange network %s\n", argtype, FatalError("Xserver: %s host on strange network %s\n", argtype,
namestr); namestr);
} }
#endif #endif /* HAVE_GETADDRINFO */
} }
static void static void
@ -1435,7 +1445,7 @@ get_manager_by_name(int argc, char **argv, int i)
get_addr_by_name(argv[i], argv[i + 1], xdm_udp_port, SOCK_DGRAM, get_addr_by_name(argv[i], argv[i + 1], xdm_udp_port, SOCK_DGRAM,
&ManagerAddress, &ManagerAddressLen &ManagerAddress, &ManagerAddressLen
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
, &mgrAddr, &mgrAddrFirst , &mgrAddr, &mgrAddrFirst
#endif #endif
); );
@ -1444,7 +1454,7 @@ get_manager_by_name(int argc, char **argv, int i)
static void static void
get_fromaddr_by_name(int argc, char **argv, int i) get_fromaddr_by_name(int argc, char **argv, int i)
{ {
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
struct addrinfo *ai = NULL; struct addrinfo *ai = NULL;
struct addrinfo *aifirst = NULL; struct addrinfo *aifirst = NULL;
#endif #endif
@ -1452,11 +1462,11 @@ get_fromaddr_by_name(int argc, char **argv, int i)
FatalError("Xserver: missing -from host name in command line\n"); FatalError("Xserver: missing -from host name in command line\n");
} }
get_addr_by_name("-from", argv[i], 0, 0, &FromAddress, &FromAddressLen get_addr_by_name("-from", argv[i], 0, 0, &FromAddress, &FromAddressLen
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
, &ai, &aifirst , &ai, &aifirst
#endif #endif
); );
#if defined(IPv6) #if defined(HAVE_GETADDRINFO)
if (aifirst != NULL) if (aifirst != NULL)
freeaddrinfo(aifirst); freeaddrinfo(aifirst);
#endif #endif