From d56bf7cf73eb244bd3bc24fe5ab9031ff866dee4 Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Fri, 23 Feb 2024 02:43:17 +0100 Subject: [PATCH] gsup_client: move ownership of the msg buffer into struct resp The resp is already referencing data inside the msg buffer. It should take the ownership of the incoming message and the caller must take care of it. --- src/libcharon/plugins/osmo_epdg/gsup_client.c | 2 +- src/libcharon/plugins/osmo_epdg/gsup_client.h | 17 +++++++++++++++++ .../plugins/osmo_epdg/osmo_epdg_listener.c | 15 ++++----------- .../plugins/osmo_epdg/osmo_epdg_provider.c | 10 +++++++--- 4 files changed, 29 insertions(+), 15 deletions(-) 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,