---
 src/call-forwarding.c |    4 ++++
 src/common.c          |   20 ++++++++++++++++++--
 src/common.h          |    2 ++
 src/message-waiting.c |   14 ++++++++++++++
 src/sim.c             |    2 +-
 src/sms.c             |    5 +++--
 6 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/call-forwarding.c b/src/call-forwarding.c
index 512f223..9fdfeb5 100644
--- a/src/call-forwarding.c
+++ b/src/call-forwarding.c
@@ -260,6 +260,10 @@ static void sim_set_cf_indicator(struct 
ofono_call_forwarding *cf)
                data[0] = 0x01;
 
                if (cfu_voice) {
+                       if (!valid_short_phone_number_format(
+                                               cond->phone_number.number))
+                               return;
+
                        number_len = strlen(cond->phone_number.number);
 
                        /* CFU indicator Status - Voice */
diff --git a/src/common.c b/src/common.c
index 4d93488..2096e79 100644
--- a/src/common.c
+++ b/src/common.c
@@ -234,7 +234,7 @@ struct error_entry ceer_errors[] = {
        { 127,  "Interworking, unspecified" },
 };
 
-gboolean valid_phone_number_format(const char *number)
+gboolean valid_number_format(const char *number, int length)
 {
        int len = strlen(number);
        int begin = 0;
@@ -246,7 +246,7 @@ gboolean valid_phone_number_format(const char *number)
        if (number[0] == '+')
                begin = 1;
 
-       if ((len - begin) > OFONO_MAX_PHONE_NUMBER_LENGTH)
+       if ((len - begin) > length)
                return FALSE;
 
        for (i = begin; i < len; i++) {
@@ -262,6 +262,22 @@ gboolean valid_phone_number_format(const char *number)
        return TRUE;
 }
 
+gboolean valid_phone_number_format(const char *number)
+{
+       return valid_number_format(number, OFONO_MAX_PHONE_NUMBER_LENGTH);
+}
+
+/*
+ * According to 3GPP TS 24.011 or 3GPP TS 31.102, some
+ * addresses (or numbers), like Service Centre address,
+ * Destination address, or EFADN (Abbreviated dialling numbers),
+ * are up 20 digits.
+ */
+gboolean valid_short_phone_number_format(const char *number)
+{
+       return valid_number_format(number, 20);
+}
+
 gboolean valid_cdma_phone_number_format(const char *number)
 {
        int len = strlen(number);
diff --git a/src/common.h b/src/common.h
index 64f297e..86f97f8 100644
--- a/src/common.h
+++ b/src/common.h
@@ -131,7 +131,9 @@ enum pin_type {
 
 const char *telephony_error_to_str(const struct ofono_error *error);
 
+gboolean valid_number_format(const char *number, int length);
 gboolean valid_phone_number_format(const char *number);
+gboolean valid_short_phone_number_format(const char *number);
 const char *phone_number_to_string(const struct ofono_phone_number *ph);
 void string_to_phone_number(const char *str, struct ofono_phone_number *ph);
 
diff --git a/src/message-waiting.c b/src/message-waiting.c
index d8bfe34..5322f96 100644
--- a/src/message-waiting.c
+++ b/src/message-waiting.c
@@ -192,6 +192,13 @@ static DBusMessage *set_cphs_mbdn(struct 
ofono_message_waiting *mw,
                return NULL;
        }
 
+       if (!valid_short_phone_number_format(number)) {
+               if (msg)
+                       return __ofono_error_invalid_format(msg);
+
+               return NULL;
+       }
+
        req = g_new0(struct mbdn_set_request, 1);
 
        req->mw = mw;
@@ -291,6 +298,13 @@ static DBusMessage *set_mbdn(struct ofono_message_waiting 
*mw, int mailbox,
                return NULL;
        }
 
+       if (!valid_short_phone_number_format(number)) {
+               if (msg)
+                       return __ofono_error_invalid_format(msg);
+
+               return NULL;
+       }
+
        req = g_new0(struct mbdn_set_request, 1);
 
        req->mw = mw;
diff --git a/src/sim.c b/src/sim.c
index d627647..6b3a911 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -565,7 +565,7 @@ static DBusMessage *sim_set_property(DBusConnection *conn, 
DBusMessage *msg,
 
                        dbus_message_iter_get_basic(&var_elem, &value);
 
-                       if (!valid_phone_number_format(value))
+                       if (!valid_short_phone_number_format(value))
                                goto error;
 
                        own = g_new0(struct ofono_phone_number, 1);
diff --git a/src/sms.c b/src/sms.c
index 9bb5c93..a6134bd 100644
--- a/src/sms.c
+++ b/src/sms.c
@@ -654,7 +654,8 @@ static DBusMessage *sms_set_property(DBusConnection *conn, 
DBusMessage *msg,
 
                dbus_message_iter_get_basic(&var, &value);
 
-               if (strlen(value) == 0 || !valid_phone_number_format(value))
+               if (strlen(value) == 0 ||
+                               !valid_short_phone_number_format(value))
                        return __ofono_error_invalid_format(msg);
 
                if (sms->driver->sca_set == NULL ||
@@ -983,7 +984,7 @@ static DBusMessage *sms_send_message(DBusConnection *conn, 
DBusMessage *msg,
                                        DBUS_TYPE_INVALID))
                return __ofono_error_invalid_args(msg);
 
-       if (valid_phone_number_format(to) == FALSE)
+       if (valid_short_phone_number_format(to) == FALSE)
                return __ofono_error_invalid_format(msg);
 
        msg_list = sms_text_prepare(to, text, sms->ref, use_16bit_ref,
-- 
1.7.2.3

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to