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:
parent
5397854877
commit
2ffe0f8a35
|
@ -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)
|
||||||
|
|
17
os/access.c
17
os/access.c
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
36
os/xdmcp.c
36
os/xdmcp.c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue