Do not execute the callback job if it has been cancelled since registration
authorMartin Willi <martin@strongswan.org>
Thu, 3 Dec 2009 07:00:04 +0000 (08:00 +0100)
committerMartin Willi <martin@strongswan.org>
Thu, 3 Dec 2009 07:00:43 +0000 (08:00 +0100)
src/charon/processing/jobs/callback_job.c

index ee71fc5..ad51dc5 100644 (file)
@@ -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);
 }