aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2001-06-20 00:00:05 +0000
committerKen Raeburn <raeburn@mit.edu>2001-06-20 00:00:05 +0000
commit3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa (patch)
tree02bf1f45da8e111538085773324f2dd52e65feaf /src
parent26444a8941bed940c588602eb9371825b2fa58eb (diff)
downloadkrb5-3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa.zip
krb5-3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa.tar.gz
krb5-3ef1ecb6226c6d976b2eccc4d6882c7dafa466fa.tar.bz2
Use a "struct addrlist" instead of separate count and pointer-to-pointer values
for internal interfaces for looking up servers. Add a new routine to free the addrlist contents, so that memory management can be changed in one place. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13390 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/include/ChangeLog10
-rw-r--r--src/include/k5-int.h22
-rw-r--r--src/krb524/ChangeLog4
-rw-r--r--src/krb524/sendmsg.c43
-rw-r--r--src/lib/krb5/os/ChangeLog23
-rw-r--r--src/lib/krb5/os/accessor.c1
-rw-r--r--src/lib/krb5/os/changepw.c50
-rw-r--r--src/lib/krb5/os/locate_kdc.c59
-rw-r--r--src/lib/krb5/os/os-proto.h6
-rw-r--r--src/lib/krb5/os/sendto_kdc.c34
10 files changed, 136 insertions, 116 deletions
diff --git a/src/include/ChangeLog b/src/include/ChangeLog
index cb73197..8858905 100644
--- a/src/include/ChangeLog
+++ b/src/include/ChangeLog
@@ -1,3 +1,13 @@
+2001-06-19 Ken Raeburn <raeburn@mit.edu>
+
+ * k5-int.h (struct addrlist): New type.
+ (ADDRLIST_INIT): New macro.
+ (krb5int_free_addrlist): Declare.
+ (krb5int_locate_server): Update declaration.
+ (KRB5INT_ACCESS_STRUCT_VERSION): Update to 3.
+ (struct _krb5int_access): Change locale_server prototype. Add
+ free_addrlist function pointer field.
+
2001-06-11 Ezra Peisach <epeisach@mit.edu>
* k5-util.h: Add prototypes for krb5_compat_recvauth_version() and
diff --git a/src/include/k5-int.h b/src/include/k5-int.h
index 0a6c9a8..a58d282 100644
--- a/src/include/k5-int.h
+++ b/src/include/k5-int.h
@@ -544,14 +544,18 @@ void krb5_os_free_context (krb5_context);
krb5_error_code krb5_find_config_files (void);
+struct addrlist {
+ struct sockaddr **addrs;
+ int naddrs;
+ int space;
+};
+#define ADDRLIST_INIT { 0, 0, 0 }
+extern void krb5int_free_addrlist (struct addrlist *);
+
krb5_error_code
krb5int_locate_server (krb5_context,
const krb5_data *realm,
- /* Thing pointed to will be filled in with a
- pointer to a block of sockaddr pointers,
- with each sockaddr allocated separately
- (wasteful, oh well). */
- struct sockaddr ***addrs, int *naddrs,
+ struct addrlist *,
/* Only meaningful for kdc, really... */
int want_masters,
/* look up [realms]->$realm->$name in krb5.conf */
@@ -1566,16 +1570,16 @@ void krb5int_set_prompt_types
/* To keep happy libraries which are (for now) accessing internal stuff */
/* Make sure to increment by one when changing the struct */
-#define KRB5INT_ACCESS_STRUCT_VERSION 2
+#define KRB5INT_ACCESS_STRUCT_VERSION 3
typedef struct _krb5int_access {
krb5_error_code (*krb5_locate_kdc) (krb5_context, const krb5_data *,
- struct sockaddr ***, int *, int);
+ struct addrlist *, int);
krb5_error_code (*krb5_locate_server) (krb5_context, const krb5_data *,
- struct sockaddr ***, int *,
- int,
+ struct addrlist *, int,
const char *, const char *,
int, int, int);
+ void (*free_addrlist) (struct addrlist *);
unsigned int krb5_max_skdc_timeout;
unsigned int krb5_skdc_timeout_shift;
unsigned int krb5_skdc_timeout_1;
diff --git a/src/krb524/ChangeLog b/src/krb524/ChangeLog
index 9389020..ba597d5 100644
--- a/src/krb524/ChangeLog
+++ b/src/krb524/ChangeLog
@@ -1,3 +1,7 @@
+2001-06-19 Ken Raeburn <raeburn@mit.edu>
+
+ * sendmsg.c (krb524_sendto_kdc): Use new locate_server interface.
+
2001-06-06 Ezra Peisach <epeisach@mit.edu>
* test.c (print_key): Pass in des_cblock* instead of char *.
diff --git a/src/krb524/sendmsg.c b/src/krb524/sendmsg.c
index 3d7b433..00c55f0 100644
--- a/src/krb524/sendmsg.c
+++ b/src/krb524/sendmsg.c
@@ -68,8 +68,7 @@ krb524_sendto_kdc (context, message, realm, reply)
krb5_data * reply;
{
register int timeout, host, i;
- struct sockaddr **addr;
- int naddr;
+ struct addrlist al = ADDRLIST_INIT;
struct servent *serv;
int sent, nready;
krb5_error_code retval;
@@ -90,37 +89,37 @@ krb524_sendto_kdc (context, message, realm, reply)
serv = getservbyname(KRB524_SERVICE, "udp");
port = serv ? serv->s_port : htons (KRB524_PORT);
- retval = internals.krb5_locate_server(context, realm, &addr, &naddr, 0,
+ retval = internals.krb5_locate_server(context, realm, &al, 0,
"krb524_server", "_krb524",
0, port, 0);
if (retval == KRB5_REALM_CANT_RESOLVE || retval == KRB5_REALM_UNKNOWN) {
/* Fallback heuristic: Assume krb524 port on every KDC might
work. */
- retval = internals.krb5_locate_kdc(context, realm, &addr, &naddr, 0);
+ retval = internals.krb5_locate_kdc(context, realm, &al, 0);
/*
* Bash the ports numbers.
*/
if (retval == 0)
- for (i = 0; i < naddr; i++) {
- if (addr[i]->sa_family == AF_INET)
- sa2sin (addr[i])->sin_port = port;
+ for (i = 0; i < al.naddrs; i++) {
+ if (al.addrs[i]->sa_family == AF_INET)
+ sa2sin (al.addrs[i])->sin_port = port;
}
}
if (retval)
return retval;
- if (naddr == 0)
+ if (al.naddrs == 0)
return KRB5_REALM_UNKNOWN;
- socklist = (SOCKET *)malloc(naddr * sizeof(SOCKET));
+ socklist = (SOCKET *)malloc(al.naddrs * sizeof(SOCKET));
if (socklist == NULL) {
- free(addr);
+ internals.free_addrlist (&al);
return ENOMEM;
}
- for (i = 0; i < naddr; i++)
+ for (i = 0; i < al.naddrs; i++)
socklist[i] = INVALID_SOCKET;
if (!(reply->data = malloc(internals.krb5_max_dgram_size))) {
- free(addr);
+ internals.free_addrlist (&al);
free(socklist);
return ENOMEM;
}
@@ -145,10 +144,11 @@ krb524_sendto_kdc (context, message, realm, reply)
* do exponential backoff.
*/
- for (timeout = internals.krb5_skdc_timeout_1; timeout < internals.krb5_max_skdc_timeout;
+ for (timeout = internals.krb5_skdc_timeout_1;
+ timeout < internals.krb5_max_skdc_timeout;
timeout <<= internals.krb5_skdc_timeout_shift) {
sent = 0;
- for (host = 0; host < naddr; host++) {
+ for (host = 0; host < al.naddrs; host++) {
/* send to the host, wait timeout seconds for a response,
then move on. */
/* cache some sockets for each host */
@@ -163,7 +163,8 @@ krb524_sendto_kdc (context, message, realm, reply)
* protocol exists to support a particular socket type
* within a given protocol family.
*/
- socklist[host] = socket(addr[host]->sa_family, SOCK_DGRAM, 0);
+ socklist[host] = socket(al.addrs[host]->sa_family, SOCK_DGRAM,
+ 0);
if (socklist[host] == INVALID_SOCKET)
continue; /* try other hosts */
/* have a socket to send/recv from */
@@ -172,12 +173,12 @@ krb524_sendto_kdc (context, message, realm, reply)
socket will time out, so use connect, send, recv instead of
sendto, recvfrom. The connect here may return an error if
the destination host is known to be unreachable. */
- if (connect(socklist[host],
- addr[host], socklen(addr[host])) == SOCKET_ERROR)
+ if (connect(socklist[host], al.addrs[host],
+ socklen(al.addrs[host])) == SOCKET_ERROR)
continue;
}
- if (send(socklist[host],
- message->data, (int) message->length, 0) != message->length)
+ if (send(socklist[host], message->data, (int) message->length, 0)
+ != message->length)
continue;
retry:
waitlen.tv_usec = 0;
@@ -238,13 +239,13 @@ krb524_sendto_kdc (context, message, realm, reply)
}
retval = KRB5_KDC_UNREACH;
out:
- for (i = 0; i < naddr; i++)
+ for (i = 0; i < al.naddrs; i++)
if (socklist[i] != INVALID_SOCKET)
(void) closesocket (socklist[i]);
#if 0
SOCKET_CLEANUP(); /* Done with sockets for now */
#endif
- free(addr);
+ internals.free_addrlist (&al);
free(socklist);
if (retval) {
free(reply->data);
diff --git a/src/lib/krb5/os/ChangeLog b/src/lib/krb5/os/ChangeLog
index 2767311..137ef76 100644
--- a/src/lib/krb5/os/ChangeLog
+++ b/src/lib/krb5/os/ChangeLog
@@ -1,3 +1,26 @@
+2001-06-19 Ken Raeburn <raeburn@mit.edu>
+
+ * locate_kdc.c (struct addrlist, ADDRLIST_INIT): Moved to
+ k5-int.h.
+ (krb5int_free_addrlist): Renamed from free_list; no longer
+ static.
+ (krb5_locate_srv_conf, krb5_locate_srv_dns, krb5int_locate_server,
+ krb5_locate_kdc): Use addrlist in interface.
+
+ * sendto_kdc.c (krb5_sendto_kdc): Use new struct addrlist
+ interface.
+
+ * changepw.c (krb5_locate_kpasswd): Use addrlist structure in
+ interface and implementation.
+ (krb5_change_password): Likewise.
+
+ * accessor.c (krb5int_accessor): Fill in free_addrlist function
+ pointer field.
+
+ * os-proto.h (krb5_locate_kdc): Update prototype.
+
+ * t_std_conf.c (test_locate_kdc): Update tests for new API.
+
2001-06-12 Ezra Peisach <epeisach@mit.edu>
* sn2princ.c, hst_realm.c, an_to_ln.c: Cast argument to
diff --git a/src/lib/krb5/os/accessor.c b/src/lib/krb5/os/accessor.c
index d3c842a..bcf89a7 100644
--- a/src/lib/krb5/os/accessor.c
+++ b/src/lib/krb5/os/accessor.c
@@ -39,6 +39,7 @@ krb5int_accessor(internals, version)
krb5int_access internals_temp;
internals_temp.krb5_locate_server = krb5int_locate_server;
internals_temp.krb5_locate_kdc = krb5_locate_kdc;
+ internals_temp.free_addrlist = krb5int_free_addrlist;
internals_temp.krb5_max_skdc_timeout = krb5_max_skdc_timeout;
internals_temp.krb5_skdc_timeout_shift = krb5_skdc_timeout_shift;
internals_temp.krb5_skdc_timeout_1 = krb5_skdc_timeout_1;
diff --git a/src/lib/krb5/os/changepw.c b/src/lib/krb5/os/changepw.c
index 0a6d0e5..7153b75 100644
--- a/src/lib/krb5/os/changepw.c
+++ b/src/lib/krb5/os/changepw.c
@@ -54,27 +54,24 @@
*/
static krb5_error_code
-krb5_locate_kpasswd(context, realm, addr_pp, naddrs)
- krb5_context context;
- const krb5_data *realm;
- struct sockaddr ***addr_pp;
- int *naddrs;
+krb5_locate_kpasswd(krb5_context context, const krb5_data *realm,
+ struct addrlist *addrlist)
{
krb5_error_code code;
- code = krb5int_locate_server (context, realm, addr_pp, naddrs, 0,
+ code = krb5int_locate_server (context, realm, addrlist, 0,
"kpasswd_server", "_kpasswd", 0,
DEFAULT_KPASSWD_PORT, 0);
if (code) {
- code = krb5int_locate_server (context, realm, addr_pp, naddrs, 0,
+ code = krb5int_locate_server (context, realm, addrlist, 0,
"admin_server", "_kerberos-adm", 1,
DEFAULT_KPASSWD_PORT, 0);
if (!code) {
/* Success with admin_server but now we need to change the
port number to use DEFAULT_KPASSWD_PORT. */
int i;
- for ( i=0;i<*naddrs;i++ ) {
- struct sockaddr *a = (*addr_pp)[i];
+ for ( i=0;i<addrlist->naddrs;i++ ) {
+ struct sockaddr *a = addrlist->addrs[i];
if (a->sa_family == AF_INET)
sa2sin (a)->sin_port = htons(DEFAULT_KPASSWD_PORT);
}
@@ -100,17 +97,15 @@ krb5_change_password(context, creds, newpw, result_code,
char *code_string;
krb5_error_code code = 0;
int i, addrlen;
- struct sockaddr **addr_p;
struct sockaddr_storage local_addr, remote_addr, tmp_addr;
- int naddr_p;
int cc, local_result_code, tmp_len;
SOCKET s1 = INVALID_SOCKET, s2 = INVALID_SOCKET;
int tried_one = 0;
+ struct addrlist al = ADDRLIST_INIT;
/* Initialize values so that cleanup call can safely check for NULL */
auth_context = NULL;
- addr_p = NULL;
memset(&chpw_req, 0, sizeof(krb5_data));
memset(&chpw_rep, 0, sizeof(krb5_data));
memset(&ap_req, 0, sizeof(krb5_data));
@@ -126,7 +121,7 @@ krb5_change_password(context, creds, newpw, result_code,
if ((code = krb5_locate_kpasswd(context,
krb5_princ_realm(context, creds->client),
- &addr_p, &naddr_p)))
+ &al)))
goto cleanup;
/* this is really obscure. s1 is used for all communications. it
@@ -155,16 +150,23 @@ krb5_change_password(context, creds, newpw, result_code,
goto cleanup;
}
- for (i=0; i<naddr_p; i++) {
+ /*
+ * This really should try fallback addresses in cases of timeouts.
+ * For now, where the MIT KDC implementation only supports one
+ * kpasswd server machine anyways, we'll only try the first IPv4
+ * address we can connect() to. This isn't right for multi-homed
+ * servers; oh well.
+ */
+ for (i=0; i<al.naddrs; i++) {
fd_set fdset;
struct timeval timeout;
/* XXX Now the locate_ functions can return IPv6 addresses. */
- if (addr_p[i]->sa_family != AF_INET)
+ if (al.addrs[i]->sa_family != AF_INET)
continue;
tried_one = 1;
- if (connect(s2, addr_p[i], socklen(addr_p[i])) == SOCKET_ERROR) {
+ if (connect(s2, al.addrs[i], socklen(al.addrs[i])) == SOCKET_ERROR) {
if (SOCKET_ERRNO == ECONNREFUSED || SOCKET_ERRNO == EHOSTUNREACH)
continue; /* try the next addr */
@@ -244,7 +246,7 @@ krb5_change_password(context, creds, newpw, result_code,
}
if ((cc = sendto(s1, chpw_req.data, (int) chpw_req.length, 0,
- addr_p[i], socklen(addr_p[i]))) != chpw_req.length)
+ al.addrs[i], socklen(al.addrs[i]))) != chpw_req.length)
{
if ((cc < 0) && ((SOCKET_ERRNO == ECONNREFUSED) ||
(SOCKET_ERRNO == EHOSTUNREACH)))
@@ -316,9 +318,11 @@ krb5_change_password(context, creds, newpw, result_code,
goto cleanup;
result_code_string->length = strlen(code_string);
- if ((result_code_string->data =
- (char *) malloc(result_code_string->length)) == NULL)
- return(ENOMEM);
+ result_code_string->data = malloc(result_code_string->length);
+ if (result_code_string->data == NULL) {
+ code = ENOMEM;
+ goto cleanup;
+ }
strncpy(result_code_string->data, code_string, result_code_string->length);
}
@@ -339,11 +343,7 @@ cleanup:
if (auth_context != NULL)
krb5_auth_con_free(context, auth_context);
- if (addr_p != NULL) {
- for (i = 0; i < naddr_p; i++)
- krb5_xfree (addr_p[i]);
- krb5_xfree(addr_p);
- }
+ krb5int_free_addrlist (&al);
if (s1 != INVALID_SOCKET)
closesocket(s1);
diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c
index c518c1f..a4587e0 100644
--- a/src/lib/krb5/os/locate_kdc.c
+++ b/src/lib/krb5/os/locate_kdc.c
@@ -133,13 +133,6 @@ static int get_port (const char *service, int stream, int defalt)
#endif
}
-struct addrlist {
- struct sockaddr **addrs;
- int naddrs;
- int space;
-};
-#define ADDRLIST_INIT { 0, 0, 0 }
-
static int
grow_list (struct addrlist *lp, int nmore)
{
@@ -164,8 +157,10 @@ grow_list (struct addrlist *lp, int nmore)
return 0;
}
-static void
-free_list (struct addrlist *lp)
+/* Free up everything pointed to by the addrlist structure, but don't
+ free the structure itself. */
+void
+krb5int_free_addrlist (struct addrlist *lp)
{
int i;
for (i = 0; i < lp->naddrs; i++)
@@ -174,6 +169,7 @@ free_list (struct addrlist *lp)
lp->addrs = NULL;
lp->naddrs = lp->space = 0;
}
+#define free_list krb5int_free_addrlist
static int
add_sockaddr_to_list (struct addrlist *lp, const struct sockaddr *addr,
@@ -516,29 +512,23 @@ krb5_locate_srv_conf_1(krb5_context context, const krb5_data *realm,
#ifdef TEST
static krb5_error_code
-krb5_locate_srv_conf(context, realm, name, addr_pp, naddrs, get_masters,
+krb5_locate_srv_conf(context, realm, name, al, get_masters,
udpport, sec_udpport)
krb5_context context;
const krb5_data *realm;
const char * name;
- struct sockaddr ***addr_pp;
- int *naddrs;
+ struct addrlist *al;
int get_masters;
int udpport, sec_udpport;
{
krb5_error_code ret;
- struct addrlist al = ADDRLIST_INIT;
- ret = krb5_locate_srv_conf_1 (context, realm, name, &al,
+ ret = krb5_locate_srv_conf_1 (context, realm, name, al,
get_masters, udpport, sec_udpport);
- if (ret) {
- free_list (&al);
+ if (ret)
return ret;
- }
- if (al.naddrs == 0) /* Couldn't resolve any KDC names */
+ if (al->naddrs == 0) /* Couldn't resolve any KDC names */
return KRB5_REALM_CANT_RESOLVE;
- *addr_pp = al.addrs;
- *naddrs = al.naddrs;
return 0;
}
#endif
@@ -789,15 +779,9 @@ krb5_locate_srv_dns_1 (const krb5_data *realm,
static krb5_error_code
krb5_locate_srv_dns(const krb5_data *realm,
const char *service, const char *protocol,
- struct sockaddr ***addr_pp, int *naddrs)
+ struct addrlist *al)
{
- struct addrlist al = ADDRLIST_INIT;
- krb5_error_code code;
-
- code = krb5_locate_srv_dns_1 (realm, service, protocol, &al);
- *addr_pp = al.addrs;
- *naddrs = al.naddrs;
- return code;
+ return krb5_locate_srv_dns_1 (realm, service, protocol, al);
}
#endif
#endif /* KRB5_DNS_LOOKUP */
@@ -808,7 +792,7 @@ krb5_locate_srv_dns(const krb5_data *realm,
krb5_error_code
krb5int_locate_server (krb5_context context, const krb5_data *realm,
- struct sockaddr ***addr_pp, int *naddrs,
+ struct addrlist *addrlist,
int get_masters,
const char *profname, const char *dnsname,
int is_stream,
@@ -818,6 +802,8 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm,
krb5_error_code code;
struct addrlist al = ADDRLIST_INIT;
+ *addrlist = al;
+
/*
* We always try the local file first
*/
@@ -851,18 +837,14 @@ krb5int_locate_server (krb5_context context, const krb5_data *realm,
free_list (&al);
return KRB5_REALM_CANT_RESOLVE;
}
- *addr_pp = al.addrs;
- *naddrs = al.naddrs;
+ *addrlist = al;
return 0;
}
krb5_error_code
-krb5_locate_kdc(context, realm, addr_pp, naddrs, get_masters)
- krb5_context context;
- const krb5_data *realm;
- struct sockaddr ***addr_pp;
- int *naddrs;
- int get_masters;
+krb5_locate_kdc(krb5_context context, const krb5_data *realm,
+ struct addrlist *addrlist,
+ int get_masters)
{
int udpport, sec_udpport;
@@ -874,8 +856,7 @@ krb5_locate_kdc(context, realm, addr_pp, naddrs, get_masters)
if (sec_udpport == udpport)
sec_udpport = 0;
- return krb5int_locate_server (context, realm, addr_pp, naddrs, get_masters,
- "kdc",
+ return krb5int_locate_server (context, realm, addrlist, get_masters, "kdc",
(get_masters
? "_kerberos-master"
: "_kerberos"),
diff --git a/src/lib/krb5/os/os-proto.h b/src/lib/krb5/os/os-proto.h
index ceba9b4..7be2c3f 100644
--- a/src/lib/krb5/os/os-proto.h
+++ b/src/lib/krb5/os/os-proto.h
@@ -32,11 +32,7 @@
#ifdef SOCK_DGRAM /* XXX hack... */
krb5_error_code krb5_locate_kdc
- PROTOTYPE((krb5_context,
- const krb5_data *,
- struct sockaddr ***,
- int *,
- int));
+ PROTOTYPE((krb5_context, const krb5_data *, struct addrlist *, int));
#endif
#ifdef HAVE_NETINET_IN_H
diff --git a/src/lib/krb5/os/sendto_kdc.c b/src/lib/krb5/os/sendto_kdc.c
index 486066b..45e6d00 100644
--- a/src/lib/krb5/os/sendto_kdc.c
+++ b/src/lib/krb5/os/sendto_kdc.c
@@ -62,37 +62,36 @@ krb5_sendto_kdc (context, message, realm, reply, use_master)
krb5_data * reply;
int use_master;
{
- register int timeout, host, i;
- struct sockaddr **addr;
- int naddr;
+ int timeout, host, i;
int sent, nready;
krb5_error_code retval;
SOCKET *socklist;
fd_set readable;
struct timeval waitlen;
int cc;
+ struct addrlist addrs;
/*
* find KDC location(s) for realm
*/
- if ((retval = krb5_locate_kdc(context, realm, &addr, &naddr, use_master)))
+ if ((retval = krb5_locate_kdc(context, realm, &addrs, use_master)))
return retval;
- if (naddr == 0)
+ if (addrs.naddrs == 0)
return (use_master ? KRB5_KDC_UNREACH : KRB5_REALM_UNKNOWN);
- socklist = (SOCKET *)malloc(naddr * sizeof(SOCKET));
+ socklist = (SOCKET *)malloc(addrs.naddrs * sizeof(SOCKET));
if (socklist == NULL) {
- krb5_xfree(addr);
+ krb5int_free_addrlist (&addrs);
return ENOMEM;
}
- for (i = 0; i < naddr; i++)
+ for (i = 0; i < addrs.naddrs; i++)
socklist[i] = INVALID_SOCKET;
if (!(reply->data = malloc(krb5_max_dgram_size))) {
- for (i = 0; i < naddr; i++)
- krb5_xfree (addr[i]);
- krb5_xfree(addr);
+ for (i = 0; i < addrs.naddrs; i++)
+ krb5_xfree (addrs.addrs[i]);
+ krb5int_free_addrlist (&addrs);
krb5_xfree(socklist);
return ENOMEM;
}
@@ -106,7 +105,7 @@ krb5_sendto_kdc (context, message, realm, reply, use_master)
* See below for commented out SOCKET_CLEANUP()
*/
if (SOCKET_INITIALIZE()) { /* PC needs this for some tcp/ip stacks */
- krb5_xfree(addr);
+ krb5int_free_addrlist (&addrs);
krb5_xfree(socklist);
free(reply->data);
return SOCKET_ERRNO;
@@ -120,7 +119,7 @@ krb5_sendto_kdc (context, message, realm, reply, use_master)
for (timeout = krb5_skdc_timeout_1; timeout < krb5_max_skdc_timeout;
timeout <<= krb5_skdc_timeout_shift) {
sent = 0;
- for (host = 0; host < naddr; host++) {
+ for (host = 0; host < addrs.naddrs; host++) {
/* send to the host, wait timeout seconds for a response,
then move on. */
/* cache some sockets for each host */
@@ -135,7 +134,8 @@ krb5_sendto_kdc (context, message, realm, reply, use_master)
* protocol exists to support a particular socket type
* within a given protocol family.
*/
- socklist[host] = socket(addr[host]->sa_family, SOCK_DGRAM, 0);
+ socklist[host] = socket(addrs.addrs[host]->sa_family,
+ SOCK_DGRAM, 0);
if (socklist[host] == INVALID_SOCKET)
continue; /* try other hosts */
/* have a socket to send/recv from */
@@ -145,7 +145,7 @@ krb5_sendto_kdc (context, message, realm, reply, use_master)
sendto, recvfrom. The connect here may return an error if
the destination host is known to be unreachable. */
if (connect(socklist[host],
- addr[host], socklen(addr[host])) == SOCKET_ERROR)
+ addrs.addrs[host], socklen(addrs.addrs[host])) == SOCKET_ERROR)
continue;
}
if (send(socklist[host],
@@ -214,13 +214,13 @@ krb5_sendto_kdc (context, message, realm, reply, use_master)
}
retval = KRB5_KDC_UNREACH;
out:
- for (i = 0; i < naddr; i++)
+ for (i = 0; i < addrs.naddrs; i++)
if (socklist[i] != INVALID_SOCKET)
(void) closesocket (socklist[i]);
#if 0
SOCKET_CLEANUP(); /* Done with sockets for now */
#endif
- krb5_xfree(addr);
+ krb5int_free_addrlist (&addrs);
krb5_xfree(socklist);
if (retval) {
free(reply->data);