aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/sa/trap_manager.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-01-23 15:51:47 +0100
committerTobias Brunner <tobias@strongswan.org>2013-01-23 15:51:47 +0100
commit4eb09d14e22ee2bccdf02bec3dd99aa533da3b15 (patch)
treeb9a00aeb5c178927e03ee187fc4c66bda7d7a5ff /src/libcharon/sa/trap_manager.c
parent8d631ebabd557b23649a4266f3bc3658f01e076c (diff)
downloadstrongswan-4eb09d14e22ee2bccdf02bec3dd99aa533da3b15.tar.bz2
strongswan-4eb09d14e22ee2bccdf02bec3dd99aa533da3b15.tar.xz
Avoid a deadlock when installing a trap policy failed
Diffstat (limited to 'src/libcharon/sa/trap_manager.c')
-rw-r--r--src/libcharon/sa/trap_manager.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/libcharon/sa/trap_manager.c b/src/libcharon/sa/trap_manager.c
index 69b23e1df..6c0ae19c7 100644
--- a/src/libcharon/sa/trap_manager.c
+++ b/src/libcharon/sa/trap_manager.c
@@ -170,8 +170,8 @@ METHOD(trap_manager_t, install, u_int32_t,
if (status != SUCCESS)
{
DBG1(DBG_CFG, "installing trap failed");
- child_sa->destroy(child_sa);
reqid = 0;
+ /* hold off destroying the CHILD_SA until we released the lock */
}
else
{
@@ -184,6 +184,10 @@ METHOD(trap_manager_t, install, u_int32_t,
}
this->lock->unlock(this->lock);
+ if (status != SUCCESS)
+ {
+ child_sa->destroy(child_sa);
+ }
if (found)
{
destroy_entry(found);