diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-12-28 21:22:32 +0100 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2018-12-29 02:10:12 +0100 |
commit | bc6b8fbd0839f89ce55672e19b0581dabad7853e (patch) | |
tree | 6051f32beb6299598dd1d9779556d6d8e279895b /src/libvlr/vlr_access_req_fsm.c | |
parent | e5eb6d4ffd862b14858b28cc2b705c7c64836924 (diff) |
fix vlr ops.subscr_assoc re-associationneels/35c335c3
In rare cases, a conn is already associated with a subscriber. So far, we
abort()ed on that. Rather log an error and keep the service running.
Related: OS#3743
Change-Id: Ic0d54644bc735700220b1ef3a4384c217d57d20f
Diffstat (limited to 'src/libvlr/vlr_access_req_fsm.c')
-rw-r--r-- | src/libvlr/vlr_access_req_fsm.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/libvlr/vlr_access_req_fsm.c b/src/libvlr/vlr_access_req_fsm.c index 3a0760d84..3b4028524 100644 --- a/src/libvlr/vlr_access_req_fsm.c +++ b/src/libvlr/vlr_access_req_fsm.c @@ -72,7 +72,7 @@ struct proc_arq_priv { bool implicitly_accepted_parq_by_ciphering_cmd; }; -static void assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub) +static int assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub) { struct proc_arq_priv *par = fi->priv; struct vlr_instance *vlr = par->vlr; @@ -81,7 +81,7 @@ static void assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *v par->vsub = vsub; /* Tell MSC to associate this subscriber with the given * connection */ - vlr->ops.subscr_assoc(par->msc_conn_ref, par->vsub); + return vlr->ops.subscr_assoc(par->msc_conn_ref, par->vsub); } static const char *vlr_proc_arq_result_name(const struct osmo_fsm_inst *fi) @@ -371,8 +371,10 @@ static void proc_arq_vlr_fn_init(struct osmo_fsm_inst *fi, GSM48_REJECT_NETWORK_FAILURE); } vsub->proc_arq_fsm = fi; - assoc_par_with_subscr(fi, vsub); - proc_arq_vlr_fn_post_imsi(fi); + if (assoc_par_with_subscr(fi, vsub) != 0) + proc_arq_fsm_done(fi, GSM48_REJECT_NETWORK_FAILURE); + else + proc_arq_vlr_fn_post_imsi(fi); vlr_subscr_put(vsub); return; } @@ -414,8 +416,10 @@ static void proc_arq_vlr_fn_w_obt_imsi(struct osmo_fsm_inst *fi, proc_arq_fsm_done(fi, GSM48_REJECT_IMSI_UNKNOWN_IN_VLR); return; } - assoc_par_with_subscr(fi, vsub); - proc_arq_vlr_fn_post_imsi(fi); + if (assoc_par_with_subscr(fi, vsub)) + proc_arq_fsm_done(fi, GSM48_REJECT_NETWORK_FAILURE); + else + proc_arq_vlr_fn_post_imsi(fi); vlr_subscr_put(vsub); } |