diff options
author | Tobias Brunner <tobias@strongswan.org> | 2012-03-01 12:52:17 +0100 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2012-03-20 17:31:40 +0100 |
commit | 894c52cba2169a1499a720cf71986f0b0cf66d39 (patch) | |
tree | 41806d37d8e1143688db19db79d712bf558fb3b2 /src | |
parent | 4b2f428f40a7ad776f0159cd538b08017dc7f483 (diff) | |
download | strongswan-894c52cba2169a1499a720cf71986f0b0cf66d39.tar.bz2 strongswan-894c52cba2169a1499a720cf71986f0b0cf66d39.tar.xz |
Fixed deadlock if checkin_and_destroy is called during shutdown.
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/ike_sa_manager.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/libcharon/sa/ike_sa_manager.c b/src/libcharon/sa/ike_sa_manager.c index 74a33dd0d..e981744a2 100644 --- a/src/libcharon/sa/ike_sa_manager.c +++ b/src/libcharon/sa/ike_sa_manager.c @@ -1490,6 +1490,16 @@ METHOD(ike_sa_manager_t, checkin_and_destroy, void, if (get_entry_by_sa(this, ike_sa_id, ike_sa, &entry, &segment) == SUCCESS) { + if (entry->driveout_waiting_threads && entry->driveout_new_threads) + { /* it looks like flush() has been called and the SA is being deleted + * anyway, just check it in */ + DBG2(DBG_MGR, "ignored check-in and destroy of IKE_SA during shutdown"); + entry->checked_out = FALSE; + entry->condvar->broadcast(entry->condvar); + unlock_single_segment(this, segment); + return; + } + /* drive out waiting threads, as we are in hurry */ entry->driveout_waiting_threads = TRUE; /* mark it, so no new threads can get this entry */ |