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