aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Golde <openbsc@ngolde.de>2010-06-29 20:13:06 +0200
committerHarald Welte <laforge@gnumonks.org>2010-06-30 09:10:04 +0200
commit5950236b5e1bd54bde2cf3740115f4f9cc518b21 (patch)
tree26ff419b13d4dcf15c6a2ff96c7d789c6d9d7536
parentbd17b39fd2dd4c520c21951b90dccf153165d657 (diff)
* Fix null ptr dereference and sms memleak in case the recipient of an sms sent via vty is not attached. Store the sms in the database in this case for later delivery.
The problem is that sms_from_text returns NULL in case the subscriber is not attached which a) leaks memory of the previously allocated sms and b) runs into a null ptr dereference in _send_sms_str(). There may be a better solution than this but this is the easiest way of noticing and taking action I could find without changing return values of sms_from_text.
-rw-r--r--openbsc/src/vty_interface_layer3.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/openbsc/src/vty_interface_layer3.c b/openbsc/src/vty_interface_layer3.c
index 9a2c5face..102b49655 100644
--- a/openbsc/src/vty_interface_layer3.c
+++ b/openbsc/src/vty_interface_layer3.c
@@ -166,11 +166,6 @@ struct gsm_sms *sms_from_text(struct gsm_subscriber *receiver, const char *text)
if (!sms)
return NULL;
- if (!receiver->lac) {
- /* subscriber currently not attached, store in database? */
- return NULL;
- }
-
sms->receiver = subscr_get(receiver);
strncpy(sms->text, text, sizeof(sms->text)-1);
@@ -195,7 +190,16 @@ static int _send_sms_str(struct gsm_subscriber *receiver, char *str,
sms = sms_from_text(receiver, str);
sms->protocol_id = tp_pid;
- gsm411_send_sms_subscr(receiver, sms);
+
+ if(!receiver->lac){
+ /* subscriber currently not attached, store in database */
+ if (db_sms_store(sms) != 0) {
+ LOGP(DSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
+ return CMD_WARNING;
+ }
+ } else {
+ gsm411_send_sms_subscr(receiver, sms);
+ }
return CMD_SUCCESS;
}