lynxis lazus has submitted this change. ( 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(-)
Approvals: lynxis lazus: Looks good to me, approved pespin: Looks good to me, but someone else must approve laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified
diff --git a/include/osmocom/vlr/vlr.h b/include/osmocom/vlr/vlr.h index eac99b0..98ce0be 100644 --- a/include/osmocom/vlr/vlr.h +++ b/include/osmocom/vlr/vlr.h @@ -319,6 +319,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, @@ -335,6 +337,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 6f5e7cd..0347f63 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 e97f19d..c306ff7 100644 --- a/src/libvlr/vlr_lu_fsm.c +++ b/src/libvlr/vlr_lu_fsm.c @@ -1767,11 +1767,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, @@ -1825,11 +1831,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)