diff --git a/src/libcharon/plugins/osmo_epdg/gsup_client.c b/src/libcharon/plugins/osmo_epdg/gsup_client.c index 841af75bb..1fe9a7dfb 100644 --- a/src/libcharon/plugins/osmo_epdg/gsup_client.c +++ b/src/libcharon/plugins/osmo_epdg/gsup_client.c @@ -600,6 +600,7 @@ static bool on_recv_pdu(void *data, osmo_epdg_ipa_client_t *client, struct msgb goto out; } + resp->pdu = pdu; DBG1(DBG_NET, "epdg: gsupc: receive gsup message %s/%d", resp->gsup.imsi, resp->gsup.message_type); @@ -646,7 +647,6 @@ static bool on_recv_pdu(void *data, osmo_epdg_ipa_client_t *client, struct msgb DBG1(DBG_NET, "epdg: gsupc: received unknown message type %02x", resp->gsup.message_type); goto out; } - free(pdu); return TRUE; out: diff --git a/src/libcharon/plugins/osmo_epdg/gsup_client.h b/src/libcharon/plugins/osmo_epdg/gsup_client.h index 3edd4f916..c302d856f 100644 --- a/src/libcharon/plugins/osmo_epdg/gsup_client.h +++ b/src/libcharon/plugins/osmo_epdg/gsup_client.h @@ -32,9 +32,26 @@ struct osmo_epdg_gsup_response_t { struct osmo_gsup_message gsup; + /* keep pdu around because gsup takes ownership of data out of pdu */ + struct msgb *pdu; }; typedef struct osmo_epdg_gsup_response_t osmo_epdg_gsup_response_t; +static inline void osmo_epdg_gsup_resp_free(osmo_epdg_gsup_response_t *resp) +{ + if (!resp) + { + return; + } + + if (resp->pdu) + { + free(resp->pdu); + } + + free(resp); +} + typedef struct osmo_epdg_gsup_client_t osmo_epdg_gsup_client_t; /** diff --git a/src/libcharon/plugins/osmo_epdg/osmo_epdg_listener.c b/src/libcharon/plugins/osmo_epdg/osmo_epdg_listener.c index 42b2c79f4..3e0155002 100644 --- a/src/libcharon/plugins/osmo_epdg/osmo_epdg_listener.c +++ b/src/libcharon/plugins/osmo_epdg/osmo_epdg_listener.c @@ -84,7 +84,7 @@ METHOD(listener_t, eap_authorize, bool, } ue->set_state(ue, UE_LOCATION_UPDATED); ue->put(ue); - free(resp); + osmo_epdg_gsup_resp_free(resp); return TRUE; err: @@ -95,10 +95,7 @@ err: ue->put(ue); } - if (resp) - { - free(resp); - } + osmo_epdg_gsup_resp_free(resp); /* keep still subscribed */ return TRUE; } @@ -195,15 +192,11 @@ METHOD(listener_t, authorize, bool, ue->put(ue); address->destroy(address); - free(resp); + osmo_epdg_gsup_resp_free(resp); return TRUE; err: - - if (resp) - { - free(resp); - } + osmo_epdg_gsup_resp_free(resp); if (ue) { diff --git a/src/libcharon/plugins/osmo_epdg/osmo_epdg_provider.c b/src/libcharon/plugins/osmo_epdg/osmo_epdg_provider.c index e7a16940b..5701f40a1 100644 --- a/src/libcharon/plugins/osmo_epdg/osmo_epdg_provider.c +++ b/src/libcharon/plugins/osmo_epdg/osmo_epdg_provider.c @@ -112,14 +112,15 @@ METHOD(simaka_provider_t, get_quintuplet, bool, if (resp->gsup.message_type != OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT) { DBG1(DBG_NET, "epdg_provider: SendAuthInfo Error! Cause: %02x", resp->gsup.cause); - return FALSE; + goto err; } struct osmo_auth_vector *auth = &resp->gsup.auth_vectors[0]; if (resp->gsup.num_auth_vectors == 0) { /* TODO: invalid auth data received */ - return FALSE; + DBG1(DBG_NET, "epdg_provider: SendAuthInfo Invalid Auth Received!"); + goto err; } memcpy(rand, auth->rand, AKA_RAND_LEN); @@ -129,8 +130,11 @@ METHOD(simaka_provider_t, get_quintuplet, bool, memcpy(xres, auth->res, auth->res_len); *xres_len = auth->res_len; - free(resp); + osmo_epdg_gsup_resp_free(resp); return TRUE; +err: + osmo_epdg_gsup_resp_free(resp); + return FALSE; } METHOD(simaka_provider_t, resync, bool,