Hi Tommi,

On 02/13/2015 06:23 AM, Tommi Kenakkala wrote:
TP-OA max length comparisons were incorrect because TP-OA's 7-bit
coded octets transport eleven 8-bit chars which take 23 bytes in UTF-8.
Increase address array accordingly and don't compare byte length to
character limit, but to a proper limit.
---
  src/smsutil.c |   12 +++++++++---
  src/smsutil.h |    6 +++++-
  2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/smsutil.c b/src/smsutil.c
index be60ee9..213e50e 100644
--- a/src/smsutil.c
+++ b/src/smsutil.c
@@ -524,7 +524,8 @@ static gboolean encode_validity_period(const struct 
sms_validity_period *vp,
  gboolean sms_encode_address_field(const struct sms_address *in, gboolean sc,
                                        unsigned char *pdu, int *offset)
  {
-       size_t len = strlen(in->address);
+       const char *addr = (const char *)&in->address;
+       size_t len = strlen(addr);
        unsigned char addr_len = 0;
        unsigned char p[10];

@@ -546,7 +547,8 @@ gboolean sms_encode_address_field(const struct sms_address 
*in, gboolean sc,
                unsigned char *gsm;
                unsigned char *r;

-               if (len > 11)
+               /* TP-OA's 10 octets transport 11 8-bit chars */
+               if (g_utf8_strlen(addr, strlen(addr)) > 11)
                        return FALSE;

                gsm = convert_utf8_to_gsm(in->address, len, NULL, &written, 0);
@@ -675,7 +677,11 @@ gboolean sms_decode_address_field(const unsigned char 
*pdu, int len,
                if (utf8 == NULL)
                        return FALSE;

-               if (strlen(utf8) > 20) {
+               /*
+                * TP-OA's 10 octets transport 11 8-bit chars,
+                * which take 23 bytes in unicode.
+                */
+               if (strlen(utf8) > 23) {

22, not 23.

                        g_free(utf8);
                        return FALSE;
                }
diff --git a/src/smsutil.h b/src/smsutil.h
index b1001f8..d252810 100644
--- a/src/smsutil.h
+++ b/src/smsutil.h
@@ -220,7 +220,11 @@ enum cbs_geo_scope {
  struct sms_address {
        enum sms_number_type number_type;
        enum sms_numbering_plan numbering_plan;
-       char address[21]; /* Max 20 in semi-octet, 11 in alnum */
+       /*
+        * An alphanum TP-OA is 10 7-bit coded octets, which can carry
+        * 11 8-bit characters. Those converted to UTF-8 take 23 bytes.

22 bytes + null terminator.

+        */
+       char address[23];
  };

  struct sms_scts {


Regards,
-Denis
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to