diff options
author | Mark Eichin <eichin@mit.edu> | 1995-11-13 01:39:39 +0000 |
---|---|---|
committer | Mark Eichin <eichin@mit.edu> | 1995-11-13 01:39:39 +0000 |
commit | f62b855a72c221335f157501d7a05ca1923a41a8 (patch) | |
tree | c03efea973b524322cb037dd47e1cb482462ae83 /src/krb524/conv_creds.c | |
parent | c66f134a4616b17657a0691993ac39b8b23cafbc (diff) | |
download | krb5-f62b855a72c221335f157501d7a05ca1923a41a8.tar.gz krb5-f62b855a72c221335f157501d7a05ca1923a41a8.tar.xz krb5-f62b855a72c221335f157501d7a05ca1923a41a8.zip |
* conv_creds.c (krb524_convert_creds_kdc): loop through all of the
addresses returned by krb5_locate_kdc, don't just try the first one.
* krb524d.c (do_connection): check for particular failures of
decode_krb5_ticket, as well as for messages that are one int long
(which will eliminate our own error replies.)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@7095 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/krb524/conv_creds.c')
-rw-r--r-- | src/krb524/conv_creds.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/krb524/conv_creds.c b/src/krb524/conv_creds.c index cd62d4cb1..5ab295f2b 100644 --- a/src/krb524/conv_creds.c +++ b/src/krb524/conv_creds.c @@ -58,7 +58,7 @@ int krb524_convert_creds_kdc(context, v5creds, v4creds) CREDENTIALS *v4creds; { struct sockaddr_in *addrs; - int ret, naddrs; + int ret, naddrs, i; if ((ret = krb5_locate_kdc(context, &v5creds->server->realm, &addrs, &naddrs))) @@ -66,9 +66,26 @@ int krb524_convert_creds_kdc(context, v5creds, v4creds) if (naddrs == 0) ret = KRB5_KDC_UNREACH; else { - addrs[0].sin_port = 0; /* use krb524 default port */ - ret = krb524_convert_creds_addr(context, v5creds, v4creds, - (struct sockaddr *) &addrs[0]); + for (i = 0; i<naddrs; i++) { + addrs[i].sin_port = 0; /* use krb524 default port */ + ret = krb524_convert_creds_addr(context, v5creds, v4creds, + (struct sockaddr *) &addrs[i]); + /* stop trying on success */ + if (!ret) break; + switch(ret) { + case ECONNREFUSED: + case ENETUNREACH: + case ENETDOWN: + case ETIMEDOUT: + case EHOSTDOWN: + case EHOSTUNREACH: + continue; + default: + break; /* out of switch */ + } + /* if we fall through to here, it wasn't an "ok" error */ + break; + } } free(addrs); |