aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>1999-10-22 21:48:44 +0000
committerKen Raeburn <raeburn@mit.edu>1999-10-22 21:48:44 +0000
commit9620779cb3f3b29e75bfb8c4d8b8010873f98bd1 (patch)
treea724f96c6ab8d1408475118691468eeb971ee094
parentf3388e060315d8c17f74049191eaf26768d090de (diff)
downloadkrb5-9620779cb3f3b29e75bfb8c4d8b8010873f98bd1.zip
krb5-9620779cb3f3b29e75bfb8c4d8b8010873f98bd1.tar.gz
krb5-9620779cb3f3b29e75bfb8c4d8b8010873f98bd1.tar.bz2
changepw.c (krb5_change_password): Wait only two minutes, not indefinitely, for a response from the kpasswd server
git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-1@11870 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r--src/lib/krb5/os/ChangeLog5
-rw-r--r--src/lib/krb5/os/changepw.c37
2 files changed, 42 insertions, 0 deletions
diff --git a/src/lib/krb5/os/ChangeLog b/src/lib/krb5/os/ChangeLog
index f994cca..49d4043 100644
--- a/src/lib/krb5/os/ChangeLog
+++ b/src/lib/krb5/os/ChangeLog
@@ -1,3 +1,8 @@
+1999-10-22 Ken Raeburn <raeburn@mit.edu>
+
+ * changepw.c (krb5_change_password): Wait only two minutes, not
+ indefinitely, for a response from the kpasswd server.
+
1999-09-21 Ken Raeburn <raeburn@mit.edu>
* changepw.c: Changes from Jeffrey Altman to look up kpasswd
diff --git a/src/lib/krb5/os/changepw.c b/src/lib/krb5/os/changepw.c
index 26daedd..3355538 100644
--- a/src/lib/krb5/os/changepw.c
+++ b/src/lib/krb5/os/changepw.c
@@ -198,6 +198,9 @@ krb5_change_password(context, creds, newpw, result_code,
for (i=0; i<naddr_p; i++)
{
+ fd_set fdset;
+ struct timeval timeout;
+
if (connect(s2, &addr_p[i], sizeof(addr_p[i])) == SOCKET_ERROR)
{
if ((SOCKET_ERRNO == ECONNREFUSED) || (SOCKET_ERRNO == EHOSTUNREACH))
@@ -298,6 +301,21 @@ krb5_change_password(context, creds, newpw, result_code,
chpw_rep.data = (char *) malloc(chpw_rep.length);
/* XXX need a timeout/retry loop here */
+ FD_ZERO (&fdset);
+ FD_SET (s1, &fdset);
+ timeout.tv_sec = 120;
+ timeout.tv_usec = 0;
+ switch (select (s1 + 1, &fdset, 0, 0, &timeout)) {
+ case -1:
+ code = SOCKET_ERRNO;
+ goto cleanup;
+ case 0:
+ code = ETIMEDOUT;
+ goto cleanup;
+ default:
+ /* fall through */
+ ;
+ }
/* "recv" would be good enough here... except that Windows/NT
commits the atrocity of returning -1 to indicate failure,
@@ -576,6 +594,9 @@ krb5_change_password(context, creds, newpw, result_code,
for (i=0; i<out; i++)
{
+ fd_set fdset;
+ struct timeval timeout;
+
if (connect(s2, &addr_p[i], sizeof(addr_p[i])) == SOCKET_ERROR)
{
if ((SOCKET_ERRNO == ECONNREFUSED) || (SOCKET_ERRNO == EHOSTUNREACH))
@@ -677,6 +698,22 @@ krb5_change_password(context, creds, newpw, result_code,
/* XXX need a timeout/retry loop here */
+ FD_ZERO (&fdset);
+ FD_SET (s1, &fdset);
+ timeout.tv_sec = 120;
+ timeout.tv_usec = 0;
+ switch (select (s1 + 1, &fdset, 0, 0, &timeout)) {
+ case -1:
+ code = SOCKET_ERRNO;
+ goto cleanup;
+ case 0:
+ code = ETIMEDOUT;
+ goto cleanup;
+ default:
+ /* fall through */
+ ;
+ }
+
/* "recv" would be good enough here... except that Windows/NT
commits the atrocity of returning -1 to indicate failure,
but leaving errno set to 0.