From 7590ff3fd6cde4264f6e7961f8d9dcafbb526271 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Fri, 12 May 2017 15:37:27 +0200 Subject: fix subscriber random extension allocation range The VTY config allows above 32bit range extensions, but db_subscriber_alloc_exten() was unable to generate extensions outside of 32bit. Add VTY regression test and fix the problem by using proper 64bit types. Related: OS#2253 Change-Id: I9afe6a8833004ecd2f3f936b2d5aa4de8e7dbcb0 --- openbsc/src/libmsc/db.c | 8 ++++---- openbsc/tests/vty_test_runner.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 9fa64152f..5fe2a3c6b 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -1260,13 +1260,13 @@ int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber, uint64_t smin, uint64_t smax) { dbi_result result = NULL; - uint32_t try; + uint64_t try; for (;;) { try = (rand() % (smax - smin + 1) + smin); result = dbi_conn_queryf(conn, "SELECT * FROM Subscriber " - "WHERE extension = %i", + "WHERE extension = %"PRIu64, try ); if (!result) { @@ -1284,8 +1284,8 @@ int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber, uint64_t smin, } dbi_result_free(result); } - sprintf(subscriber->extension, "%i", try); - DEBUGP(DDB, "Allocated extension %i for IMSI %s.\n", try, subscriber->imsi); + sprintf(subscriber->extension, "%"PRIu64, try); + DEBUGP(DDB, "Allocated extension %"PRIu64 " for IMSI %s.\n", try, subscriber->imsi); return db_sync_subscriber(subscriber); } /* diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index b8869116f..92775d5b7 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -485,6 +485,17 @@ class TestVTYNITB(TestVTYGenericBSC): self.assert_(res.find("subscriber-create-on-demand random 9999999998 9999999999")) self.vty.command("end") + res = self.vty.command('subscriber create imsi ' + imsi) + print(res) + self.assert_(res.find(" IMSI: " + imsi) > 0) + self.assert_(res.find("9999999998") > 0 or res.find("9999999999") > 0) + self.assert_(res.find(" Extension: ") > 0) + + res = self.vty.command('subscriber imsi ' + imsi + ' delete') + self.assert_("" == res) + + res = self.vty.command('show subscriber imsi '+imsi) + self.assert_(('% No subscriber found for imsi ' + imsi) == res) def testSubscriberSettings(self): -- cgit v1.2.3