static void silc_ske_completion(SilcSKE ske)
{
/* Call the completion callback */
- if (!ske->freed && !ske->aborted && ske->callbacks->completed) {
+ if (!ske->aborted && ske->callbacks->completed) {
if (ske->status != SILC_SKE_STATUS_OK)
ske->callbacks->completed(ske, ske->status, NULL, NULL, NULL,
ske->callbacks->context);
void *destructor_context)
{
SilcSKE ske = fsm_context;
- ske->running = FALSE;
- if (ske->freed)
silc_ske_free(ske);
}
void silc_ske_free(SilcSKE ske)
{
- SILC_LOG_DEBUG(("Freeing Key Exchange object"));
-
if (!ske)
return;
- if (ske->running) {
- ske->freed = TRUE;
+ SILC_LOG_DEBUG(("Freeing Key Exchange object %p: aborted=%u refcount=%hu", ske, ske->aborted, ske->refcnt));
if (ske->aborted) {
/* If already aborted, destroy the session immediately */
silc_fsm_next(&ske->fsm, silc_ske_st_initiator_failure);
silc_fsm_continue_sync(&ske->fsm);
}
- return;
- }
ske->refcnt--;
if (ske->refcnt > 0)
silc_free(ske->hash);
silc_free(ske->callbacks);
- memset(ske, 'F', sizeof(*ske));
+ memset(ske, 0xdd, sizeof(*ske));
silc_free(ske);
}
SilcSKEParams params,
SilcSKEStartPayload start_payload)
{
- SILC_LOG_DEBUG(("Start SKE as initiator"));
+ SILC_LOG_DEBUG(("Start SKE %p as initiator; stream=%p; params=%p; start_payload=%p", ske, stream, params, start_payload));
if (!ske || !stream || !params || !params->version)
return NULL;
ske->timeout = params->timeout_secs ? params->timeout_secs : 30;
ske->start_payload = start_payload;
ske->version = params->version;
- ske->running = TRUE;
+ ++ ske->refcnt;
/* Link to packet stream to get key exchange packets */
ske->stream = stream;
ske->version = params->version;
if (!ske->version)
return NULL;
- ske->running = TRUE;
+ ++ ske->refcnt;
/* Link to packet stream to get key exchange packets */
ske->stream = stream;
ske->rekey = rekey;
ske->responder = FALSE;
- ske->running = TRUE;
ske->rekeying = TRUE;
+ ++ ske->refcnt;
/* Link to packet stream to get key exchange packets */
ske->stream = stream;
ske->rekey = rekey;
ske->responder = TRUE;
- ske->running = TRUE;
ske->rekeying = TRUE;
ske->packet = packet;
+ ++ ske->refcnt;
/* Link to packet stream to get key exchange packets */
ske->stream = stream;