(tn): don't advance hostent->h_addr_list, use a copy instead
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5084 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -2045,6 +2045,7 @@ tn(int argc, char **argv)
|
|||||||
char *cmd, *hostp = 0, *portp = 0;
|
char *cmd, *hostp = 0, *portp = 0;
|
||||||
char *user = 0;
|
char *user = 0;
|
||||||
int family, port = 0;
|
int family, port = 0;
|
||||||
|
char **addr_list;
|
||||||
|
|
||||||
/* clear the socket address prior to use */
|
/* clear the socket address prior to use */
|
||||||
|
|
||||||
@@ -2146,6 +2147,7 @@ tn(int argc, char **argv)
|
|||||||
if (host) {
|
if (host) {
|
||||||
strcpy_truncate(_hostname, host->h_name, sizeof(_hostname));
|
strcpy_truncate(_hostname, host->h_name, sizeof(_hostname));
|
||||||
family = host->h_addrtype;
|
family = host->h_addrtype;
|
||||||
|
addr_list = host->h_addr_list;
|
||||||
|
|
||||||
switch(family) {
|
switch(family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
@@ -2153,7 +2155,7 @@ tn(int argc, char **argv)
|
|||||||
sa_size = sizeof(sin);
|
sa_size = sizeof(sin);
|
||||||
sa = (struct sockaddr *)&sin;
|
sa = (struct sockaddr *)&sin;
|
||||||
sin.sin_family = family;
|
sin.sin_family = family;
|
||||||
sin.sin_addr = *((struct in_addr *)(*host->h_addr_list));
|
sin.sin_addr = *((struct in_addr *)(*addr_list));
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
@@ -2161,7 +2163,7 @@ tn(int argc, char **argv)
|
|||||||
sa_size = sizeof(sin6);
|
sa_size = sizeof(sin6);
|
||||||
sa = (struct sockaddr *)&sin6;
|
sa = (struct sockaddr *)&sin6;
|
||||||
sin6.sin6_family = family;
|
sin6.sin6_family = family;
|
||||||
sin6.sin6_addr = *((struct in6_addr *)(*host->h_addr_list));
|
sin6.sin6_addr = *((struct in6_addr *)(*addr_list));
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
@@ -2274,14 +2276,14 @@ tn(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (connect(net, sa, sa_size) < 0) {
|
if (connect(net, sa, sa_size) < 0) {
|
||||||
if (host && host->h_addr_list[1]) {
|
if (host && addr_list[1]) {
|
||||||
int oerrno = errno;
|
int oerrno = errno;
|
||||||
|
|
||||||
switch(family) {
|
switch(family) {
|
||||||
case AF_INET :
|
case AF_INET :
|
||||||
fprintf(stderr, "telnet: connect to address %s: ",
|
fprintf(stderr, "telnet: connect to address %s: ",
|
||||||
inet_ntoa(sin.sin_addr));
|
inet_ntoa(sin.sin_addr));
|
||||||
sin.sin_addr = *((struct in_addr *)(*++host->h_addr_list));
|
sin.sin_addr = *((struct in_addr *)(*++addr_list));
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
case AF_INET6: {
|
case AF_INET6: {
|
||||||
@@ -2290,7 +2292,7 @@ tn(int argc, char **argv)
|
|||||||
fprintf(stderr, "telnet: connect to address %s: ",
|
fprintf(stderr, "telnet: connect to address %s: ",
|
||||||
inet_ntop(AF_INET6, &sin6.sin6_addr, buf,
|
inet_ntop(AF_INET6, &sin6.sin6_addr, buf,
|
||||||
sizeof(buf)));
|
sizeof(buf)));
|
||||||
sin6.sin6_addr = *((struct in6_addr *)(*++host->h_addr_list));
|
sin6.sin6_addr = *((struct in6_addr *)(*++addr_list));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -2648,14 +2650,9 @@ sourceroute(char *arg, char **cpp, int *lenp)
|
|||||||
if ((tmp = inet_addr(cp)) != -1) {
|
if ((tmp = inet_addr(cp)) != -1) {
|
||||||
sin_addr.s_addr = tmp;
|
sin_addr.s_addr = tmp;
|
||||||
} else if ((host = roken_gethostbyname(cp))) {
|
} else if ((host = roken_gethostbyname(cp))) {
|
||||||
#if defined(h_addr)
|
|
||||||
memmove(&sin_addr,
|
memmove(&sin_addr,
|
||||||
host->h_addr_list[0],
|
host->h_addr_list[0],
|
||||||
sizeof(sin_addr));
|
sizeof(sin_addr));
|
||||||
#else
|
|
||||||
memmove(&sin_addr, host->h_addr,
|
|
||||||
sizeof(sin_addr));
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
*cpp = cp;
|
*cpp = cp;
|
||||||
return(0);
|
return(0);
|
||||||
|
Reference in New Issue
Block a user