diff --git a/src/mm-sms-part-cdma.c b/src/mm-sms-part-cdma.c index a579121b6493ba0ec6062d5c5d13350a31a2510e..d02e9dc545537087a37947ae59858fd7cb30fda7 100644 --- a/src/mm-sms-part-cdma.c +++ b/src/mm-sms-part-cdma.c @@ -869,6 +869,12 @@ read_bearer_data_user_data (MMSmsPart *sms_part, gchar *text; guint i; + if (num_fields == 0) { + mm_obj_dbg (log_object, " text: ''"); + mm_sms_part_set_text (sms_part, ""); + break; + } + SUBPARAMETER_SIZE_CHECK (byte_offset + ((bit_offset + (num_fields * 7)) / 8)); text = g_malloc (num_fields + 1); @@ -888,6 +894,12 @@ read_bearer_data_user_data (MMSmsPart *sms_part, gchar *text; guint i; + if (num_fields == 0) { + mm_obj_dbg (log_object, " text: ''"); + mm_sms_part_set_text (sms_part, ""); + break; + } + SUBPARAMETER_SIZE_CHECK (byte_offset + 1 + ((bit_offset + (num_fields * 8)) / 8)); latin = g_malloc (num_fields + 1); diff --git a/src/tests/test-sms-part-cdma.c b/src/tests/test-sms-part-cdma.c index 935a9c6b16ec17c466b36626003c1ee3d7ba5c19..61a12e71135301ad0e91de7ab0f56eaced191197 100644 --- a/src/tests/test-sms-part-cdma.c +++ b/src/tests/test-sms-part-cdma.c @@ -105,6 +105,27 @@ common_test_invalid_part_from_pdu (const guint8 *pdu, g_free (hexpdu); } +static void +common_test_valid_part_from_hexpdu (const gchar *hexpdu) +{ + g_autoptr(MMSmsPart) part = NULL; + GError *error = NULL; + + part = mm_sms_part_cdma_new_from_pdu (0, hexpdu, NULL, &error); + g_assert (part != NULL); + g_assert (error == NULL); +} + +static void +common_test_valid_part_from_pdu (const guint8 *pdu, + gsize pdu_size) +{ + g_autofree gchar *hexpdu = NULL; + + hexpdu = mm_utils_bin2hexstr (pdu, pdu_size); + common_test_valid_part_from_hexpdu (hexpdu); +} + static void test_pdu1 (void) { @@ -370,6 +391,17 @@ test_empty_unicode_user_data (void) common_test_invalid_part_from_pdu (pdu, sizeof (pdu)); } +static void +test_empty_ascii_user_data (void) +{ + static const guint8 pdu[] = { + 0x00, 0x08, 0x08, 0x01, 0x06, 0x10, 0x34, 0x00, + 0x00, 0x01, 0x00 }; + + /* valid but don't care about exact details */ + common_test_valid_part_from_pdu (pdu, sizeof (pdu)); +} + /********************* PDU CREATOR TESTS *********************/ static void @@ -576,6 +608,7 @@ int main (int argc, char **argv) g_test_add_func ("/MM/SMS/CDMA/PDU-Parser/latin-encoding-2", test_latin_encoding_2); g_test_add_func ("/MM/SMS/CDMA/PDU-Parser/unicode-encoding", test_unicode_encoding); g_test_add_func ("/MM/SMS/CDMA/PDU-Parser/empty-unicode-user-data", test_empty_unicode_user_data); + g_test_add_func ("/MM/SMS/CDMA/PDU-Parser/empty-ascii-user-data", test_empty_ascii_user_data); g_test_add_func ("/MM/SMS/CDMA/PDU-Creator/ascii-encoding", test_create_pdu_text_ascii_encoding); g_test_add_func ("/MM/SMS/CDMA/PDU-Creator/latin-encoding", test_create_pdu_text_latin_encoding);