diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-01-26 13:52:42 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-01-28 20:42:52 +0100 |
commit | 555b2e5ac128211edffa34a586fe5f548eb3acba (patch) | |
tree | 34a4a53e556255035857440448f277f6a96a4d57 /openbsc/tests/sgsn | |
parent | 925c57fb545b072159a831bff852c92795704dfe (diff) |
sgsn: Don't allow mmctx == NULL in sgsn_update_subscriber_data
Currently, sgsn_update_subscriber_data can be called with mmctx ==
NULL and will find and associate the right context (if present) based
on the subscriber's IMSI. This will not happen in regular use
any more, since sgsn_update_subscriber_data will only be called when
subscribers are used (auth mode 'remote') and in this case
gprs_subscr_get_or_create_by_mmctx will already be called by
sgsn_auth_request. Therefore, MM context and subscriber are always
associated except for some test cases and experimental VTY usage.
The current implementation of sgsn_update_subscriber_data also causes
additional complexity for the deletion on MM contexts to avoid a
ipossible double-free MM contexts.
This commit removes the MM context <-> subscriber association code
from sgsn_update_subscriber_data. That function must always be called
with mmctx != NULL, now. To avoid problems with VTY and test usage,
the calling subscriber function now only call
sgsn_update_subscriber_data when mmctx != NULL, since the purpose of
that function is to update that state of an existing MM context after
subscriber data has been changed.
Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/tests/sgsn')
-rw-r--r-- | openbsc/tests/sgsn/sgsn_test.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/openbsc/tests/sgsn/sgsn_test.c b/openbsc/tests/sgsn/sgsn_test.c index 5d142da90..da7da855f 100644 --- a/openbsc/tests/sgsn/sgsn_test.c +++ b/openbsc/tests/sgsn/sgsn_test.c @@ -61,14 +61,13 @@ int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime, } /* override, requires '-Wl,--wrap=sgsn_update_subscriber_data' */ -void __real_sgsn_update_subscriber_data(struct sgsn_mm_ctx *, struct gsm_subscriber *); -void (*update_subscriber_data_cb)(struct sgsn_mm_ctx *, struct gsm_subscriber *) = +void __real_sgsn_update_subscriber_data(struct sgsn_mm_ctx *); +void (*update_subscriber_data_cb)(struct sgsn_mm_ctx *) = &__real_sgsn_update_subscriber_data; -void __wrap_sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx, - struct gsm_subscriber *subscr) +void __wrap_sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx) { - (*update_subscriber_data_cb)(mmctx, subscr); + (*update_subscriber_data_cb)(mmctx); } /* override, requires '-Wl,--wrap=gprs_subscr_request_update_location' */ @@ -191,12 +190,12 @@ static void test_llme(void) } struct gsm_subscriber *last_updated_subscr = NULL; -void my_dummy_sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx, - struct gsm_subscriber *subscr) +void my_dummy_sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx) { + OSMO_ASSERT(mmctx); fprintf(stderr, "Called %s, mmctx = %p, subscr = %p\n", - __func__, mmctx, subscr); - last_updated_subscr = subscr; + __func__, mmctx, mmctx->subscr); + last_updated_subscr = mmctx->subscr; } static void assert_subscr(const struct gsm_subscriber *subscr, const char *imsi) @@ -266,7 +265,9 @@ static void test_subscriber(void) /* Update entry 1 */ last_updated_subscr = NULL; gprs_subscr_update(s1); - OSMO_ASSERT(last_updated_subscr == s1); + OSMO_ASSERT(last_updated_subscr == NULL); + OSMO_ASSERT(s1->sgsn_data->mm == NULL); + OSMO_ASSERT((s1->flags & GSM_SUBSCRIBER_FIRST_CONTACT) == 0); /* There is no subscriber cache. Verify it */ gprs_subscr_cleanup(s1); |