diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c index 246847bf2..e1b417a86 100644 --- a/openbsc/src/gsm_04_11.c +++ b/openbsc/src/gsm_04_11.c @@ -276,6 +276,7 @@ static int gsm340_gen_tpdu(struct msgb *msg, struct gsm_sms *sms) u_int8_t *smsp; u_int8_t oa[12]; /* max len per 03.40 */ u_int8_t oa_len = 0; + u_int8_t octet_len; unsigned int old_msg_len = msg->len; /* generate first octet with masked bits */ @@ -321,10 +322,13 @@ static int gsm340_gen_tpdu(struct msgb *msg, struct gsm_sms *sms) /* generate TP-UD */ /* FIXME: Handle DSC of UCS2 or 8/bit default */ if (gsm338_get_sms_alphabet(sms->data_coding_scheme) == DCS_7BIT_DEFAULT) { + octet_len = sms->user_data_len*7/8; + if (sms->user_data_len*7%8 != 0) + octet_len++; /* Warning, user_data_len indicates the amount of septets * (characters), we need amount of octets occupied */ - smsp = msgb_put(msg, ceil(sms->user_data_len*7/8.0)); - memcpy(smsp, sms->user_data, ceil(sms->user_data_len*7/8.0)); + smsp = msgb_put(msg, octet_len); + memcpy(smsp, sms->user_data, octet_len); } return msg->len - old_msg_len;