[PATCH] sms: Kill the text field, fix the size and truncation

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Holger Hans Peter Freyther zecke at selfish.org
Sun Jul 24 19:57:56 UTC 2011


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--




More information about the OpenBSC mailing list