From 960cf2c54ec349549123d483eb7ea3fab1ff63e0 Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Wed, 16 Jan 2002 22:02:36 +0000 Subject: [PATCH] rx-dont-challenge-forever-20020116 don't repeat challenges forever. give up after 50 tries --- src/rx/rx.c | 34 ++++++++++++++++++++++++++++++---- src/rx/rx.h | 1 + 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/rx/rx.c b/src/rx/rx.c index c5a68ae..21d456b 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -5292,15 +5292,40 @@ void rxi_SendDelayedCallAbort(event, call, dummy) * seconds) to ask the client to authenticate itself. The routine * issues a challenge to the client, which is obtained from the * security object associated with the connection */ -void rxi_ChallengeEvent(event, conn, dummy) +void rxi_ChallengeEvent(event, conn, atries) struct rxevent *event; register struct rx_connection *conn; - char *dummy; + void *atries; { + int tries = (int) atries; conn->challengeEvent = (struct rxevent *) 0; if (RXS_CheckAuthentication(conn->securityObject, conn) != 0) { register struct rx_packet *packet; struct clock when; + + if (tries <= 0) { + /* We've failed to authenticate for too long. + * Reset any calls waiting for authentication; + * they are all in RX_STATE_PRECALL. + */ + int i; + + MUTEX_ENTER(&conn->conn_call_lock); + for (i=0; icall[i]; + if (call) { + MUTEX_ENTER(&call->lock); + if (call->state == RX_STATE_PRECALL) { + rxi_CallError(call, RX_CALL_DEAD); + rxi_SendCallAbort(call, NULL, 0, 0); + } + MUTEX_EXIT(&call->lock); + } + } + MUTEX_EXIT(&conn->conn_call_lock); + return; + } + packet = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL); if (packet) { /* If there's no packet available, do this later. */ @@ -5311,7 +5336,8 @@ void rxi_ChallengeEvent(event, conn, dummy) } clock_GetTime(&when); when.sec += RX_CHALLENGE_TIMEOUT; - conn->challengeEvent = rxevent_Post(&when, rxi_ChallengeEvent, conn, 0); + conn->challengeEvent = + rxevent_Post(&when, rxi_ChallengeEvent, conn, (void *) (tries-1)); } } @@ -5326,7 +5352,7 @@ void rxi_ChallengeOn(conn) { if (!conn->challengeEvent) { RXS_CreateChallenge(conn->securityObject, conn); - rxi_ChallengeEvent((struct rxevent *)0, conn, NULL); + rxi_ChallengeEvent(NULL, conn, (void *) RX_CHALLENGE_MAXTRIES); }; } diff --git a/src/rx/rx.h b/src/rx/rx.h index b85c279..6242ec3 100644 --- a/src/rx/rx.h +++ b/src/rx/rx.h @@ -739,6 +739,7 @@ struct rx_ackPacket { #define rx_AckDataSize(nAcks) (3 + offsetof(struct rx_ackPacket, acks[nAcks])) #define RX_CHALLENGE_TIMEOUT 2 /* Number of seconds before another authentication request packet is generated */ +#define RX_CHALLENGE_MAXTRIES 50 /* Max # of times we resend challenge */ /* RX error codes. RX uses error codes from -1 to -64. Rxgen may use other error codes < -64; user programs are expected to return positive error codes */ -- 1.9.4