From 4d7c1bfb5f20855c9ac5567147da52cc69ec7d8a Mon Sep 17 00:00:00 2001 From: mid Date: Tue, 8 Aug 2000 04:22:16 +0000 Subject: [PATCH] - Tue Aug 8 04:15:47 UTC 2000 - Fixed double-calling of faim_mutex_init - conn->type preserved after aim_conn_close --- CHANGES | 4 ++++ aim_conn.c | 40 ++++++++++++++++++++++++++++++---------- faim/aim.h | 2 ++ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index e54c938..f6d3f78 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ No release numbers ------------------ + - Tue Aug 8 04:15:47 UTC 2000 + - Fixed double-calling of faim_mutex_init + - conn->type preserved after aim_conn_close + - Mon Jul 17 01:56:31 UTC 2000 - Added 0004/000c callback (for message acknowledgments) - This goes with the AIM_IMFLAGS_ACK option that has been there diff --git a/aim_conn.c b/aim_conn.c index 2e1c35f..5eb568d 100644 --- a/aim_conn.c +++ b/aim_conn.c @@ -55,6 +55,24 @@ struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess) return newconn; } +static void aim_conn_init(struct aim_conn_t *deadconn) +{ + if (!deadconn) + return; + + deadconn->fd = -1; + deadconn->type = -1; + deadconn->seqnum = 0; + deadconn->lastactivity = 0; + deadconn->forcedlatency = 0; + deadconn->handlerlist = NULL; + deadconn->priv = NULL; + faim_mutex_init(&deadconn->active, NULL); + faim_mutex_init(&deadconn->seqnum_lock, NULL); + + return; +} + void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn) { struct aim_conn_t *cur; @@ -83,7 +101,7 @@ void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn) /* XXX: do we need this for txqueue too? */ aim_rxqueue_cleanbyconn(sess, *deadconn); - aim_conn_close(*deadconn); + aim_conn_init(*deadconn); free(*deadconn); deadconn = NULL; @@ -92,21 +110,23 @@ void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn) void aim_conn_close(struct aim_conn_t *deadconn) { + int typesav = -1; + + faim_mutex_destroy(&deadconn->active); + faim_mutex_destroy(&deadconn->seqnum_lock); if (deadconn->fd >= 3) close(deadconn->fd); - deadconn->fd = -1; - deadconn->type = -1; - deadconn->seqnum = 0; - deadconn->lastactivity = 0; - deadconn->forcedlatency = 0; + typesav = deadconn->type; if (deadconn->handlerlist) aim_clearhandlers(deadconn); - deadconn->handlerlist = NULL; if (deadconn->priv) free(deadconn->priv); - deadconn->priv = NULL; - faim_mutex_init(&deadconn->active, NULL); - faim_mutex_init(&deadconn->seqnum_lock, NULL); + + aim_conn_init(deadconn); + + deadconn->type = typesav; + + return; } struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess, diff --git a/faim/aim.h b/faim/aim.h index bbc1d30..6e000c7 100644 --- a/faim/aim.h +++ b/faim/aim.h @@ -43,6 +43,7 @@ #define faim_mutex_init pthread_mutex_init #define faim_mutex_lock pthread_mutex_lock #define faim_mutex_unlock pthread_mutex_unlock +#define faim_mutex_destroy pthread_mutex_destroy #elif defined(FAIM_USEFAKELOCKS) /* * For platforms without pthreads, we also assume @@ -55,6 +56,7 @@ #define faim_mutex_init(x, y) *x = 0 #define faim_mutex_lock(x) *x = 1; #define faim_mutex_unlock(x) *x = 0; +#define faim_mutex_destroy(x) *x = 0; #endif /* Portability stuff (DMP) */ -- 2.45.1