diff options
Diffstat (limited to 'openbsc')
-rw-r--r-- | openbsc/src/libbsc/handover_logic.c | 4 | ||||
-rw-r--r-- | openbsc/src/libcommon/gsm_subscriber_base.c | 1 | ||||
-rw-r--r-- | openbsc/src/libmsc/gsm_subscriber.c | 17 |
3 files changed, 21 insertions, 1 deletions
diff --git a/openbsc/src/libbsc/handover_logic.c b/openbsc/src/libbsc/handover_logic.c index ff6e99346..d04b3d6ea 100644 --- a/openbsc/src/libbsc/handover_logic.c +++ b/openbsc/src/libbsc/handover_logic.c @@ -100,6 +100,10 @@ int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts) if (bsc_ho_by_old_lchan(old_lchan)) return -EBUSY; + /* Don't do handover of a already closed channel */ + if (!old_lchan->conn->subscr) + return -EBUSY; + DEBUGP(DHO, "(old_lchan on BTS %u, new BTS %u)\n", old_lchan->ts->trx->bts->nr, bts->nr); diff --git a/openbsc/src/libcommon/gsm_subscriber_base.c b/openbsc/src/libcommon/gsm_subscriber_base.c index a455824a3..55bae603c 100644 --- a/openbsc/src/libcommon/gsm_subscriber_base.c +++ b/openbsc/src/libcommon/gsm_subscriber_base.c @@ -68,6 +68,7 @@ struct gsm_subscriber *subscr_alloc(void) static void subscr_free(struct gsm_subscriber *subscr) { + OSMO_ASSERT(!subscr->is_paging); llist_del(&subscr->entry); talloc_free(subscr); } diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c index 57c10cf7e..ccba360b0 100644 --- a/openbsc/src/libmsc/gsm_subscriber.c +++ b/openbsc/src/libmsc/gsm_subscriber.c @@ -33,6 +33,7 @@ #include <openbsc/gsm_subscriber.h> #include <openbsc/gsm_04_08.h> +#include <openbsc/osmo_msc.h> #include <openbsc/debug.h> #include <openbsc/paging.h> #include <openbsc/signal.h> @@ -82,7 +83,21 @@ static int subscr_paging_dispatch(unsigned int hooknum, unsigned int event, struct gsm_subscriber *subscr = param; struct paging_signal_data sig_data; - OSMO_ASSERT(subscr->is_paging); + /* + * We might receive a timeout or paging response after one + * of the systems has already stopped paging and the below + * code was executed. In this case just leave early and free + * the resources early. + * This doesn't need a subscr_put as this should have been + * executed when is_paging has been set to 0. + */ + if (!subscr->is_paging) { + LOGP(DMM, LOGL_NOTICE, "Unexpected pagign event(%d,%d) for %s\n", + hooknum, event, subscr_name(subscr)); + if (conn) + msc_release_connection(conn); + return 0; + } /* * Stop paging on all other BTS. E.g. if this is |