Patches from Dennis Wehrle, fix the truncation of SMS from the VTY
---
openbsc/src/libmsc/db.c | 34 +++++++++++++++-------------------
openbsc/src/libmsc/gsm_04_11.c | 2 +-
openbsc/src/libmsc/gsm_04_80.c | 4 +++-
3 files changed, 19 insertions(+), 21 deletions(-)
diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c
index 53675f7..d1dd749 100644
--- a/openbsc/src/libmsc/db.c
+++ b/openbsc/src/libmsc/db.c
@@ -51,7 +51,7 @@ static char *create_stmts[] = {
"INSERT OR IGNORE INTO Meta "
"(key, value) "
"VALUES "
- "('revision', '2')",
+ "('revision', '3')",
"CREATE TABLE IF NOT EXISTS Subscriber ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"created TIMESTAMP NOT NULL, "
@@ -108,9 +108,7 @@ static char *create_stmts[] = {
"ud_hdr_ind INTEGER NOT NULL, "
"dest_addr TEXT, "
"user_data BLOB, " /* TP-UD */
- /* additional data, interpreted from SMS */
- "header BLOB, " /* UD Header */
- "text TEXT " /* decoded UD after UDH */
+ "ud_length INTEGER NOT NULL "
")",
"CREATE TABLE IF NOT EXISTS VLR ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
@@ -177,7 +175,7 @@ static int check_db_revision(void)
return -EINVAL;
}
rev = dbi_result_get_string(result, "value");
- if (!rev || atoi(rev) != 2) {
+ if (!rev || atoi(rev) != 3) {
dbi_result_free(result);
return -EINVAL;
}
@@ -990,15 +988,16 @@ int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char
imei[GSM_IM
int db_sms_store(struct gsm_sms *sms)
{
dbi_result result;
- char *q_text, *q_daddr;
+ char *q_daddr;
unsigned char *q_udata;
char *validity_timestamp = "2222-2-2";
+ uint8_t octet_len = 0;
/* FIXME: generate validity timestamp based on validity_minutes */
- dbi_conn_quote_string_copy(conn, (char *)sms->text, &q_text);
dbi_conn_quote_string_copy(conn, (char *)sms->dest_addr, &q_daddr);
- dbi_conn_quote_binary_copy(conn, sms->user_data, sms->user_data_len,
+ octet_len = gsm_get_octet_len(sms->user_data_len);
+ dbi_conn_quote_binary_copy(conn, sms->user_data, octet_len,
&q_udata);
/* FIXME: correct validity period */
result = dbi_conn_queryf(conn,
@@ -1006,15 +1005,14 @@ int db_sms_store(struct gsm_sms *sms)
"(created, sender_id, receiver_id, valid_until, "
"reply_path_req, status_rep_req, protocol_id, "
"data_coding_scheme, ud_hdr_ind, dest_addr, "
- "user_data, text) VALUES "
+ "user_data, ud_length) VALUES "
"(datetime('now'), %llu, %llu, %u, "
- "%u, %u, %u, %u, %u, %s, %s, %s)",
+ "%u, %u, %u, %u, %u, %s, %s, %u)",
sms->sender->id,
sms->receiver ? sms->receiver->id : 0, validity_timestamp,
sms->reply_path_req, sms->status_rep_req, sms->protocol_id,
sms->data_coding_scheme, sms->ud_hdr_ind,
- q_daddr, q_udata, q_text);
- free(q_text);
+ q_daddr, q_udata, sms->user_data_len);
free(q_daddr);
free(q_udata);
@@ -1029,8 +1027,9 @@ static struct gsm_sms *sms_from_result(struct gsm_network *net,
dbi_result resul
{
struct gsm_sms *sms = sms_alloc();
long long unsigned int sender_id, receiver_id;
- const char *text, *daddr;
+ const char *daddr;
const unsigned char *user_data;
+ int octet_len;
if (!sms)
return NULL;
@@ -1059,17 +1058,14 @@ static struct gsm_sms *sms_from_result(struct gsm_network *net,
dbi_result resul
sms->dest_addr[sizeof(sms->dest_addr)-1] = '\0';
}
- sms->user_data_len = dbi_result_get_field_length(result, "user_data");
+ sms->user_data_len = dbi_result_get_uint(result, "ud_length");
user_data = dbi_result_get_binary(result, "user_data");
+
if (sms->user_data_len > sizeof(sms->user_data))
sms->user_data_len = (uint8_t) sizeof(sms->user_data);
+ octet_len = gsm_get_octet_len(sms->user_data_len);
memcpy(sms->user_data, user_data, sms->user_data_len);
- text = dbi_result_get_string(result, "text");
- if (text) {
- strncpy(sms->text, text, sizeof(sms->text));
- sms->text[sizeof(sms->text)-1] = '\0';
- }
return sms;
}
diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c
index ee7f577..ad3b300 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -628,7 +628,7 @@ static int gsm340_rx_tpdu(struct gsm_subscriber_connection *conn,
struct msgb *m
switch (sms_alphabet) {
case DCS_7BIT_DEFAULT:
- gsm_7bit_decode(gsms->text, smsp, gsms->user_data_len);
+ gsm_7bit_decode_hdr(gsms->text, smsp, gsms->user_data_len,
gsms->ud_hdr_ind);
break;
case DCS_8BIT_DATA:
case DCS_UCS2:
diff --git a/openbsc/src/libmsc/gsm_04_80.c b/openbsc/src/libmsc/gsm_04_80.c
index 39738a5..c7dad43 100644
--- a/openbsc/src/libmsc/gsm_04_80.c
+++ b/openbsc/src/libmsc/gsm_04_80.c
@@ -68,12 +68,14 @@ int gsm0480_send_ussd_response(struct gsm_subscriber_connection
*conn,
struct msgb *msg = gsm48_msgb_alloc();
struct gsm48_hdr *gh;
uint8_t *ptr8;
+ uint8_t octet_len;
int response_len;
/* First put the payload text into the message */
ptr8 = msgb_put(msg, 0);
response_len = gsm_7bit_encode(ptr8, response_text);
- msgb_put(msg, response_len);
+ octet_len = gsm_get_octet_len(response_len);
+ msgb_put(msg, octet_len);
/* Then wrap it as an Octet String */
msgb_wrap_with_TL(msg, ASN1_OCTET_STRING_TAG);
--
1.7.4.1
--------------090106040904000308080203--