trap-manager: Wait for install to finish before uninstalling
authorSheena Mira-ato <sheena.mira-ato@alliedtelesis.co.nz>
Wed, 20 Mar 2019 23:30:56 +0000 (12:30 +1300)
committerTobias Brunner <tobias@strongswan.org>
Wed, 27 Mar 2019 08:38:20 +0000 (09:38 +0100)
There was a race condition between install() and uninstall()
where one thread was in the process of installing a trap
entry, and had destroyed the child_sa, while the other
thread was uninstalling the same trap entry and ended up
trying to destroy the already destroyed child_sa, resulting
in a segmentation fault in the destroy_entry() function.

The uninstall() function needs to wait until all the threads
are done with the installing before proceeding to uninstall
a trap entry.

Closes strongswan/strongswan#131.

src/libcharon/sa/trap_manager.c

index 148df39..c35b8c0 100644 (file)
@@ -352,6 +352,10 @@ METHOD(trap_manager_t, uninstall, bool,
        entry_t *entry, *found = NULL;
 
        this->lock->write_lock(this->lock);
+       while (this->installing)
+       {
+               this->condvar->wait(this->condvar, this->lock);
+       }
        enumerator = this->traps->create_enumerator(this->traps);
        while (enumerator->enumerate(enumerator, &entry))
        {