--- 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