From: Martin Willi Date: Thu, 3 Dec 2009 07:00:04 +0000 (+0100) Subject: Do not execute the callback job if it has been cancelled since registration X-Git-Tag: 4.3.6~150 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cd51437e4360e9267c5fe3193df9bf40837a9956;p=thirdparty%2Fstrongswan.git Do not execute the callback job if it has been cancelled since registration --- diff --git a/src/charon/processing/jobs/callback_job.c b/src/charon/processing/jobs/callback_job.c index ee71fc5570..ad51dc55dd 100644 --- a/src/charon/processing/jobs/callback_job.c +++ b/src/charon/processing/jobs/callback_job.c @@ -126,6 +126,8 @@ static void cancel(private_callback_job_t *this) pthread_cancel(thread); pthread_join(thread, NULL); } + /* avoid later execution of a cancelled job */ + this->callback = NULL; } /** @@ -142,13 +144,17 @@ static void execute(private_callback_job_t *this) pthread_cleanup_push((void*)destroy, this); while (TRUE) { + if (this->callback == NULL) + { + cleanup = TRUE; + break; + } switch (this->callback(this->data)) { case JOB_REQUEUE_DIRECT: continue; case JOB_REQUEUE_FAIR: { - this->thread = 0; charon->processor->queue_job(charon->processor, &this->public.job_interface); break; @@ -156,13 +162,13 @@ static void execute(private_callback_job_t *this) case JOB_REQUEUE_NONE: default: { - this->thread = 0; cleanup = TRUE; break; } } break; } + this->thread = 0; unregister(this); pthread_cleanup_pop(cleanup); }