lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-msc/+/43511?usp=email )
Change subject: libvlr: lu_fsm: split off creation and start of the LU FSM ......................................................................
libvlr: lu_fsm: split off creation and start of the LU FSM
Similar to the auth_fsm, ensure the lu_fsm don't run into a use-after-free when the starting event of VLR_AUTH_E_START result in a terminating.
Change-Id: Iafce776bf1755951e525b6f7f2ef929dd31c7c9d --- M include/osmocom/vlr/vlr.h M src/libmsc/gsm_04_08.c M src/libvlr/vlr_lu_fsm.c 3 files changed, 21 insertions(+), 4 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/11/43511/1
diff --git a/include/osmocom/vlr/vlr.h b/include/osmocom/vlr/vlr.h index 12b7c6d..d64202b 100644 --- a/include/osmocom/vlr/vlr.h +++ b/include/osmocom/vlr/vlr.h @@ -312,6 +312,8 @@ bool is_r99, bool is_utran, bool assign_tmsi);
+int vlr_loc_start(struct osmo_fsm_inst *fi); + struct osmo_fsm_inst * vlr_ra_update(struct osmo_fsm_inst *parent, uint32_t parent_event_success, @@ -328,6 +330,8 @@ bool is_r99, bool is_utran, bool assign_tmsi);
+int vlr_ra_start(struct osmo_fsm_inst *fi); + void vlr_loc_update_cancel(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause fsm_cause, uint8_t gsm48_cause); diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c index 7a63220..4692ab9 100644 --- a/src/libmsc/gsm_04_08.c +++ b/src/libmsc/gsm_04_08.c @@ -419,6 +419,7 @@ osmo_gsm48_classmark1_is_r99(&lu->classmark1), is_utran, net->vlr->cfg.assign_tmsi); + vlr_loc_start(lu_fsm); if (!lu_fsm) { LOG_MSC_A(msc_a, LOGL_ERROR, "Can't start LU FSM\n"); msc_a_put(msc_a, MSC_A_USE_LOCATION_UPDATING); diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c index c8b2698..8fc54f8 100644 --- a/src/libvlr/vlr_lu_fsm.c +++ b/src/libvlr/vlr_lu_fsm.c @@ -1743,11 +1743,17 @@ LOGPFSML(fi, LOGL_ERROR, "Authentication & Ciphering is off on UTRAN network. Good luck.\n");
- osmo_fsm_inst_dispatch(fi, VLR_ULA_E_UPDATE_LA, NULL); - return fi; }
+int vlr_loc_start(struct osmo_fsm_inst *fi) +{ + if (fi) + return osmo_fsm_inst_dispatch(fi, VLR_ULA_E_UPDATE_LA, NULL); + + return -ENOENT; +} + struct osmo_fsm_inst * vlr_ra_update(struct osmo_fsm_inst *parent, uint32_t parent_event_success, @@ -1801,11 +1807,17 @@ LOGPFSML(fi, LOGL_ERROR, "Authentication & Ciphering is off on UTRAN network. Good luck.\n");
- osmo_fsm_inst_dispatch(fi, VLR_ULA_E_UPDATE_LA, NULL); - return fi; }
+int vlr_ra_start(struct osmo_fsm_inst *fi) +{ + if (fi) + return osmo_fsm_inst_dispatch(fi, VLR_ULA_E_UPDATE_LA, NULL); + + return -ENOENT; +} + void vlr_loc_update_cancel(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause fsm_cause, uint8_t gsm48_cause)