aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/paging.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-11-27 09:19:21 +0100
committerHarald Welte <laforge@gnumonks.org>2009-11-27 09:19:21 +0100
commit39a4f047c89ceb111c1756596c712a57048154e3 (patch)
tree9c237408c22b7635903884af2456f9eec5cdcc4a /openbsc/src/paging.c
parent260b7ddb239d0d497ee7bb7c8c93d52a1c0fe88c (diff)
parent1a79d364401dfad2a71f1e61ff13a3861e3da46e (diff)
Merge remote branch 'origin/master' into the lcr_rtp brancheversberg/lcr_rtp
Conflicts: openbsc/src/Makefile.am
Diffstat (limited to 'openbsc/src/paging.c')
-rw-r--r--openbsc/src/paging.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index 87c7e7d38..fe6ea52d1 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -197,6 +197,8 @@ static void paging_T3113_expired(void *data)
{
struct gsm_paging_request *req = (struct gsm_paging_request *)data;
struct paging_signal_data sig_data;
+ void *cbfn_param;
+ gsm_cbfn *cbfn;
DEBUGP(DPAG, "T3113 expired for request %p (%s)\n",
req, req->subscr->imsi);
@@ -205,11 +207,15 @@ static void paging_T3113_expired(void *data)
sig_data.bts = req->bts;
sig_data.lchan = NULL;
- dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data);
- if (req->cbfn)
- req->cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, NULL,
- req->cbfn_param);
+ /* must be destroyed before calling cbfn, to prevent double free */
+ cbfn_param = req->cbfn_param;
+ cbfn = req->cbfn;
paging_remove_request(&req->bts->paging, req);
+
+ dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data);
+ if (cbfn)
+ cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, NULL,
+ cbfn_param);
}
static int _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
@@ -233,7 +239,7 @@ static int _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
req->cbfn_param = data;
req->T3113.cb = paging_T3113_expired;
req->T3113.data = req;
- bsc_schedule_timer(&req->T3113, T3113_VALUE);
+ bsc_schedule_timer(&req->T3113, bts->network->T3113, 0);
llist_add_tail(&req->entry, &bts_entry->pending_requests);
if (!bsc_timer_pending(&bts_entry->work_timer))