lynxis lazus submitted this change.
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(-)
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)
To view, visit change 43511. To unsubscribe, or for help writing mail filters, visit settings.