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.
This commit is contained in:
Alexander Couzens 2024-02-23 02:43:17 +01:00
parent 44e23b2a45
commit d56bf7cf73
4 changed files with 29 additions and 15 deletions

View File

@ -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:

View File

@ -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;
/**

View File

@ -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)
{

View File

@ -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,