diff options
Diffstat (limited to 'src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c')
-rw-r--r-- | src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c b/src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c index b64e41c56..8a7883c8a 100644 --- a/src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c +++ b/src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c @@ -2093,9 +2093,18 @@ METHOD(kernel_ipsec_t, bypass_socket, bool, METHOD(kernel_ipsec_t, destroy, void, private_kernel_pfkey_ipsec_t *this) { - this->job->cancel(this->job); - close(this->socket); - close(this->socket_events); + if (this->job) + { + this->job->cancel(this->job); + } + if (this->socket > 0) + { + close(this->socket); + } + if (this->socket_events > 0) + { + close(this->socket_events); + } this->policies->destroy_function(this->policies, (void*)policy_entry_destroy); this->mutex->destroy(this->mutex); this->mutex_pfkey->destroy(this->mutex_pfkey); @@ -2134,21 +2143,27 @@ kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create() this->socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2); if (this->socket <= 0) { - charon->kill(charon, "unable to create PF_KEY socket"); + DBG1(DBG_KNL, "unable to create PF_KEY socket"); + destroy(this); + return NULL; } /* create a PF_KEY socket for ACQUIRE & EXPIRE */ this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2); if (this->socket_events <= 0) { - charon->kill(charon, "unable to create PF_KEY event socket"); + DBG1(DBG_KNL, "unable to create PF_KEY event socket"); + destroy(this); + return NULL; } /* register the event socket */ if (register_pfkey_socket(this, SADB_SATYPE_ESP) != SUCCESS || register_pfkey_socket(this, SADB_SATYPE_AH) != SUCCESS) { - charon->kill(charon, "unable to register PF_KEY event socket"); + DBG1(DBG_KNL, "unable to register PF_KEY event socket"); + destroy(this); + return NULL; } this->job = callback_job_create((callback_job_cb_t)receive_events, |