aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'inet/rexec.c')
-rw-r--r--inet/rexec.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/inet/rexec.c b/inet/rexec.c
index f4772475fd..d91949de3c 100644
--- a/inet/rexec.c
+++ b/inet/rexec.c
@@ -40,6 +40,7 @@ static char sccsid[] = "@(#)rexec.c 8.1 (Berkeley) 6/4/93";
#include <netinet/in.h>
+#include <alloca.h>
#include <stdio.h>
#include <netdb.h>
#include <errno.h>
@@ -56,16 +57,30 @@ rexec(ahost, rport, name, pass, cmd, fd2p)
int *fd2p;
{
struct sockaddr_in sin, sin2, from;
- struct hostent *hp;
+ struct hostent hostbuf, *hp;
+ size_t hstbuflen;
+ char *hsttmpbuf;
u_short port;
int s, timo = 1, s3;
char c;
+ int herr;
+
+ hstbuflen = 1024;
+ hsttmpbuf = __alloca (hstbuflen);
+ while (__gethostbyname_r (*ahost, &hostbuf, hsttmpbuf, hstbuflen,
+ &hp, &herr) < 0)
+ if (herr != NETDB_INTERNAL || errno != ERANGE)
+ {
+ herror(*ahost);
+ return -1;
+ }
+ else
+ {
+ /* Enlarge the buffer. */
+ hstbuflen *= 2;
+ hsttmpbuf = __alloca (hstbuflen);
+ }
- hp = gethostbyname(*ahost);
- if (hp == 0) {
- herror(*ahost);
- return (-1);
- }
*ahost = hp->h_name;
ruserpass(hp->h_name, &name, &pass);
retry: