neels has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-hnbgw/+/31008 )


Change subject: fix segfault on MGCP timeout
......................................................................

fix segfault on MGCP timeout

bisect shows that the segfault was introduced by using the MGCP client
pool:

 e62af4d46a74af4a98dc9399082f4277fb6379e5 is the first bad commit
 Author: Pau Espin Pedrol <pes...@sysmocom.de>
    Introduce support for libosmo-mgcp-client MGW pooling
    Change-Id I371dc773b58788ee21037dc25d77f556c89c6b61

The segfault:

 20230117224550365 DLMGCP DEBUG 
MGCP_CONN(to-HNB)[0x612000003ca0]{ST_CRCX_RESP}: Timeout of T1 (fsm.c:317)
 [...]
 20230117224550366 DLMGCP DEBUG 
mgw-endp(mgw-fsm-14429752-0)[0x612000003b20]{WAIT_MGW_RESPONSE}: Deallocated 
(fsm.c:568)
 20230117224550366 DMGW DEBUG 
mgw(mgw-fsm-14429752-0)[0x612000003820]{MGW_ST_CRCX_HNB}: Received Event 
MGW_EV_MGCP_TERM (mgcp_client_endpoint_fsm.c:869)
 =================================================================
 ==255699==ERROR: AddressSanitizer: heap-use-after-free on address 
0x62b000000260 at pc 0x7f282a6ee143 bp 0x7fff0d9bcae0 sp 0x7fff0d9bcad8
 READ of size 8 at 0x62b000000260 thread T0
     #0 0x7f282a6ee142 in osmo_mgcpc_ep_client 
../../../../src/osmo-mgw/src/libosmo-mgcp-client/mgcp_client_endpoint_fsm.c:223
     #1 0x55e2a84f1889 in mgw_fsm_allstate_action 
../../../../src/osmo-hnbgw/src/osmo-hnbgw/mgw_fsm.c:504
     #2 0x7f2829d50c56 in _osmo_fsm_inst_dispatch 
../../../src/libosmocore/src/fsm.c:863
     #3 0x7f2829d55a08 in _osmo_fsm_inst_term 
../../../src/libosmocore/src/fsm.c:962
     #4 0x7f282a72679a in osmo_mgcpc_ep_fsm_check_state_chg_after_response 
../../../../src/osmo-mgw/src/libosmo-mgcp-client/mgcp_client_endpoint_fsm.c:869
     #5 0x7f282a6f1869 in on_failure 
../../../../src/osmo-mgw/src/libosmo-mgcp-client/mgcp_client_endpoint_fsm.c:414
     #6 0x7f282a727ac6 in osmo_mgcpc_ep_fsm_handle_ci_events 
../../../../src/osmo-mgw/src/libosmo-mgcp-client/mgcp_client_endpoint_fsm.c:935
 [...]

When a CRCX times out, MGCP_CONN fsm terminates (libosmo-mgcp-client).
In turn the parent mgw-endp fsm terminates (libosmo-mgcp-client).
This generates an MGW_EV_MGCP_TERM event to the mgw_fsm (osmo-ttcn3-hacks).
This attempts to retrieve a pointer from mgw_fsm state:
mgw_fsm_priv->mgcpc_ep->mgcp_client
where the middle one, mgcpc_ep, is the 'mgw-endp' that already deallocated 
above.

To fix, add to /osmo-hnbgw/mgw_fsm.c a separate pointer to the
mgcp_client, to call mgcp_client_pool_put() on it. Do not use mgcpc_ep
to get the mgcp_client, because mgcpc_ep deallocates independently.

Related: OS#5862
Change-Id: I460d7249f4fc7edcfd94f6084fc8f933b491520c
---
M src/osmo-hnbgw/mgw_fsm.c
1 file changed, 9 insertions(+), 8 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-hnbgw refs/changes/08/31008/1

diff --git a/src/osmo-hnbgw/mgw_fsm.c b/src/osmo-hnbgw/mgw_fsm.c
index b58d01f..d99a7b4 100644
--- a/src/osmo-hnbgw/mgw_fsm.c
+++ b/src/osmo-hnbgw/mgw_fsm.c
@@ -115,6 +115,7 @@
        struct osmo_prim_hdr *ranap_rab_ass_resp_oph;

        /* MGW context */
+       struct mgcp_client *mgcpc;
        struct osmo_mgcpc_ep *mgcpc_ep;
        struct osmo_mgcpc_ep_ci *mgcpc_ep_ci_hnb;
        struct osmo_mgcpc_ep_ci *mgcpc_ep_ci_msc;
@@ -141,7 +142,6 @@
        RANAP_RAB_AssignmentRequestIEs_t *ies;
        const char *epname;
        struct mgcp_conn_peer mgw_info;
-       struct mgcp_client *mgcp_client;
        int rc;

        LOGPFSML(fi, LOGL_DEBUG, "RAB-AssignmentRequest received, creating HNB 
side call-leg on MGW...\n");
@@ -173,16 +173,16 @@
        mgw_info.codecs[0] = CODEC_IUFP;
        mgw_info.codecs_len = 1;

-       mgcp_client = mgcp_client_pool_get(map->hnb_ctx->gw->mgw_pool);
-       if (!mgcp_client) {
+       mgw_fsm_priv->mgcpc = mgcp_client_pool_get(map->hnb_ctx->gw->mgw_pool);
+       if (!mgw_fsm_priv->mgcpc) {
                LOGPFSML(fi, LOGL_ERROR,
                         "cannot ensure MGW endpoint -- no MGW configured, 
check configuration!\n");
                osmo_fsm_inst_state_chg(fi, MGW_ST_FAILURE, 0, 0);
                return;
        }
-       epname = mgcp_client_rtpbridge_wildcard(mgcp_client);
+       epname = mgcp_client_rtpbridge_wildcard(mgw_fsm_priv->mgcpc);
        mgw_fsm_priv->mgcpc_ep =
-           osmo_mgcpc_ep_alloc(fi, MGW_EV_MGCP_TERM, mgcp_client, 
mgw_fsm_T_defs, fi->id, "%s", epname);
+           osmo_mgcpc_ep_alloc(fi, MGW_EV_MGCP_TERM, mgw_fsm_priv->mgcpc, 
mgw_fsm_T_defs, fi->id, "%s", epname);
        mgw_fsm_priv->mgcpc_ep_ci_hnb = 
osmo_mgcpc_ep_ci_add(mgw_fsm_priv->mgcpc_ep, "to-HNB");

        osmo_mgcpc_ep_ci_request(mgw_fsm_priv->mgcpc_ep_ci_hnb, MGCP_VERB_CRCX, 
&mgw_info, fi, MGW_EV_MGCP_OK,
@@ -496,13 +496,14 @@
 static void mgw_fsm_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, 
void *data)
 {
        struct mgw_fsm_priv *mgw_fsm_priv = fi->priv;
-       struct mgcp_client *mgcp_client;

        switch (event) {
        case MGW_EV_MGCP_TERM:
                /* Put MGCP client back into MGW pool */
-               mgcp_client = osmo_mgcpc_ep_client(mgw_fsm_priv->mgcpc_ep);
-               mgcp_client_pool_put(mgcp_client);
+               if (mgw_fsm_priv->mgcpc) {
+                       mgcp_client_pool_put(mgw_fsm_priv->mgcpc);
+                       mgw_fsm_priv->mgcpc = NULL;
+               }
                mgw_fsm_priv->mgcpc_ep = NULL;
                LOGPFSML(fi, LOGL_ERROR, "Media gateway failed\n");
                osmo_fsm_inst_state_chg(fi, MGW_ST_FAILURE, 0, 0);

--
To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/31008
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-hnbgw
Gerrit-Branch: master
Gerrit-Change-Id: I460d7249f4fc7edcfd94f6084fc8f933b491520c
Gerrit-Change-Number: 31008
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofm...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to