diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2016-05-28 15:46:01 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2016-05-28 15:46:01 +0000 |
commit | 3a55204c7136fc2a34605609cc40179a0b8e8d91 (patch) | |
tree | d6e7b1008101392409fe1bac276e1f6860becfef | |
parent | a9b53e09dcd851e31206b50f81924837ef459e3c (diff) |
Use getaddrinfo() instead of the non-standard gethostbyname2().
OK deraadt@ jca@ jung@ florian@
-rw-r--r-- | lib/libc/net/rcmdsh.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/libc/net/rcmdsh.c b/lib/libc/net/rcmdsh.c index 14275d414a4..b9cbd6d5d14 100644 --- a/lib/libc/net/rcmdsh.c +++ b/lib/libc/net/rcmdsh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcmdsh.c,v 1.18 2015/11/24 22:03:33 millert Exp $ */ +/* $OpenBSD: rcmdsh.c,v 1.19 2016/05/28 15:46:00 millert Exp $ */ /* * Copyright (c) 2001, MagniComp @@ -38,6 +38,7 @@ #include <sys/wait.h> #include <signal.h> #include <errno.h> +#include <limits.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> @@ -55,7 +56,8 @@ int rcmdsh(char **ahost, int rport, const char *locuser, const char *remuser, const char *cmd, char *rshprog) { - struct hostent *hp; + static char hbuf[HOST_NAME_MAX+1]; + struct addrinfo hint, *res; int sp[2]; pid_t cpid; char *p, pwbuf[_PW_BUF_LEN]; @@ -74,9 +76,16 @@ rcmdsh(char **ahost, int rport, const char *locuser, const char *remuser, /* Validate remote hostname. */ if (strcmp(*ahost, "localhost") != 0) { - if ((hp = gethostbyname2(*ahost, AF_INET)) || - (hp = gethostbyname2(*ahost, AF_INET6))) - *ahost = hp->h_name; + memset(&hint, 0, sizeof(hint)); + hint.ai_family = PF_UNSPEC; + hint.ai_flags = AI_CANONNAME; + if (getaddrinfo(*ahost, NULL, &hint, &res) == 0) { + if (res->ai_canonname) { + strlcpy(hbuf, res->ai_canonname, sizeof(hbuf)); + *ahost = hbuf; + } + freeaddrinfo(res); + } } /* Get a socketpair we'll use for stdin and stdout. */ |