sms: Fix alphanumeric TP-OA handling
authorTommi Kenakkala <tommi.kenakkala@tieto.com>
Fri, 13 Feb 2015 15:50:16 +0000 (17:50 +0200)
committerDenis Kenzior <denkenz@gmail.com>
Fri, 13 Feb 2015 15:49:39 +0000 (09:49 -0600)
TP-OA max length comparisons were incorrect because TP-OA's 7-bit
coded octets transport eleven 8-bit chars.  The current code assumed
only 10 chars were possible.

The patch
- increases the array size to 23, (maximum of 22 bytes for UTF8
  encoding + null terminator)
- Updates the sanity check to account for the correct maximum
- For encoding, checks the maximum length in UTF8 characters instead of
  bytes

src/smsutil.c
src/smsutil.h

index be60ee95524c2224fd23b5ca42245a556e4a783e..74afb651e8e4185674330da771b9652cc7fea1bd 100644 (file)
@@ -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,
+                * 22 bytes+terminator in UTF-8.
+                */
+               if (strlen(utf8) > 22) {
                        g_free(utf8);
                        return FALSE;
                }
index b1001f8f2f3dc2a827e88305c5bbbb267f2d9c83..f293350f9437f779c84d17a6f017c23eefbc78b6 100644 (file)
@@ -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. 22 bytes + terminator in UTF-8.
+        */
+       char address[23];
 };
 
 struct sms_scts {