As per the ETSI TS 102 223 section 6.5.4,
If the terminalreceives an icon, and
either an empty or no alpha identifier/text
string is given by the UICC, than the terminal
shall reject the command with general result
"Command data not understood by terminal".
---
src/stkutil.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 171 insertions(+), 16 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 8aee8f7..28d0a86 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -74,6 +74,14 @@ struct gsm_sms_tpdu {
unsigned char tpdu[184];
};
+static gboolean check_text_and_icon( const char *in, const unsigned char icon_id)
+{
+ if ((in == NULL || strlen(in) < 1) && icon_id != 0)
+ return FALSE;
+
+ return TRUE;
+}
+
static char *decode_text(unsigned char dcs, int len, const unsigned char *data)
{
char *utf8;
@@ -2383,6 +2391,7 @@ static enum stk_command_parse_result parse_display_text(
struct comprehension_tlv_iter *iter)
{
struct stk_command_display_text *obj = &command->display_text;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2392,7 +2401,7 @@ static enum stk_command_parse_result parse_display_text(
command->destructor = destroy_display_text;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->text,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
@@ -2406,6 +2415,14 @@ static enum stk_command_parse_result parse_display_text(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->text, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_get_inkey(struct stk_command *command)
@@ -2418,6 +2435,7 @@ static enum stk_command_parse_result parse_get_inkey(
struct comprehension_tlv_iter *iter)
{
struct stk_command_get_inkey *obj = &command->get_inkey;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2427,7 +2445,7 @@ static enum stk_command_parse_result parse_get_inkey(
command->destructor = destroy_get_inkey;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->text,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
@@ -2439,6 +2457,14 @@ static enum stk_command_parse_result parse_get_inkey(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->text, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_get_input(struct stk_command *command)
@@ -2452,6 +2478,7 @@ static enum stk_command_parse_result parse_get_input(
struct comprehension_tlv_iter *iter)
{
struct stk_command_get_input *obj = &command->get_input;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2461,7 +2488,7 @@ static enum stk_command_parse_result parse_get_input(
command->destructor = destroy_get_input;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->text,
STK_DATA_OBJECT_TYPE_RESPONSE_LENGTH,
@@ -2476,6 +2503,14 @@ static enum stk_command_parse_result parse_get_input(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->text, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static enum stk_command_parse_result parse_more_time(
@@ -2501,6 +2536,7 @@ static enum stk_command_parse_result parse_play_tone(
struct comprehension_tlv_iter *iter)
{
struct stk_command_play_tone *obj = &command->play_tone;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2510,7 +2546,7 @@ static enum stk_command_parse_result parse_play_tone(
command->destructor = destroy_play_tone;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_TONE, 0,
&obj->tone,
@@ -2523,6 +2559,14 @@ static enum stk_command_parse_result parse_play_tone(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static enum stk_command_parse_result parse_poll_interval(
@@ -2556,6 +2600,7 @@ static enum stk_command_parse_result parse_setup_menu(
struct comprehension_tlv_iter *iter)
{
struct stk_command_setup_menu *obj = &command->setup_menu;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2565,7 +2610,7 @@ static enum stk_command_parse_result parse_setup_menu(
command->destructor = destroy_setup_menu;
- return parse_dataobj(iter,
+ result = parse_dataobj(iter,
STK_DATA_OBJECT_TYPE_ALPHA_ID,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->alpha_id,
@@ -2583,6 +2628,14 @@ static enum stk_command_parse_result parse_setup_menu(
STK_DATA_OBJECT_TYPE_ITEM_TEXT_ATTRIBUTE_LIST, 0,
&obj->item_text_attr_list,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_select_item(struct stk_command *command)
@@ -2630,7 +2683,11 @@ static enum stk_command_parse_result parse_select_item(
command->destructor = destroy_select_item;
- if (status == STK_PARSE_RESULT_OK && obj->items == NULL)
+ if (status != STK_PARSE_RESULT_OK)
+ return status;
+
+ if ((check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE) ||
+ obj->items == NULL)
status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
return status;
@@ -2679,6 +2736,11 @@ static enum stk_command_parse_result parse_send_sms(
if (status != STK_PARSE_RESULT_OK)
goto out;
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE) {
+ status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+ goto out;
+ }
+
if (gsm_tpdu.len == 0 && obj->cdma_sms.len == 0) {
status = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
goto out;
@@ -2814,6 +2876,7 @@ static enum stk_command_parse_result parse_setup_call(
struct comprehension_tlv_iter *iter)
{
struct stk_command_setup_call *obj = &command->setup_call;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2823,7 +2886,7 @@ static enum stk_command_parse_result parse_setup_call(
command->destructor = destroy_setup_call;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id_usr_cfm,
STK_DATA_OBJECT_TYPE_ADDRESS,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
@@ -2847,6 +2910,17 @@ static enum stk_command_parse_result parse_setup_call(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if ((check_text_and_icon(obj->alpha_id_usr_cfm,
+ obj->icon_id_usr_cfm.id) == FALSE) ||
+ (check_text_and_icon(obj->alpha_id_call_setup,
+ obj->icon_id_call_setup.id) == FALSE))
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_refresh(struct stk_command *command)
@@ -2861,6 +2935,7 @@ static enum stk_command_parse_result parse_refresh(
struct comprehension_tlv_iter *iter)
{
struct stk_command_refresh *obj = &command->refresh;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -2870,7 +2945,7 @@ static enum stk_command_parse_result parse_refresh(
command->destructor = destroy_refresh;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_FILE_LIST, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_FILE_LIST, 0,
&obj->file_list,
STK_DATA_OBJECT_TYPE_AID, 0,
&obj->aid,
@@ -2883,6 +2958,14 @@ static enum stk_command_parse_result parse_refresh(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static enum stk_command_parse_result parse_polling_off(
@@ -3036,6 +3119,7 @@ static enum stk_command_parse_result parse_setup_idle_mode_text(
{
struct stk_command_setup_idle_mode_text *obj =
&command->setup_idle_mode_text;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3045,7 +3129,7 @@ static enum stk_command_parse_result parse_setup_idle_mode_text(
command->destructor = destroy_setup_idle_mode_text;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_TEXT,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->text,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
@@ -3055,6 +3139,14 @@ static enum stk_command_parse_result parse_setup_idle_mode_text(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->text, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_run_at_command(struct stk_command *command)
@@ -3068,6 +3160,7 @@ static enum stk_command_parse_result parse_run_at_command(
struct comprehension_tlv_iter *iter)
{
struct stk_command_run_at_command *obj = &command->run_at_command;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3077,7 +3170,7 @@ static enum stk_command_parse_result parse_run_at_command(
command->destructor = destroy_run_at_command;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_AT_COMMAND,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
@@ -3089,6 +3182,14 @@ static enum stk_command_parse_result parse_run_at_command(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_send_dtmf(struct stk_command *command)
@@ -3102,6 +3203,7 @@ static enum stk_command_parse_result parse_send_dtmf(
struct comprehension_tlv_iter *iter)
{
struct stk_command_send_dtmf *obj = &command->send_dtmf;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3111,7 +3213,7 @@ static enum stk_command_parse_result parse_send_dtmf(
command->destructor = destroy_send_dtmf;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_DTMF_STRING,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
@@ -3123,6 +3225,14 @@ static enum stk_command_parse_result parse_send_dtmf(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static enum stk_command_parse_result parse_language_notification(
@@ -3213,6 +3323,7 @@ static enum stk_command_parse_result parse_close_channel(
struct comprehension_tlv_iter *iter)
{
struct stk_command_close_channel *obj = &command->close_channel;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3222,7 +3333,7 @@ static enum stk_command_parse_result parse_close_channel(
command->destructor = destroy_close_channel;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
@@ -3231,6 +3342,14 @@ static enum stk_command_parse_result parse_close_channel(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_receive_data(struct stk_command *command)
@@ -3243,6 +3362,7 @@ static enum stk_command_parse_result parse_receive_data(
struct comprehension_tlv_iter *iter)
{
struct stk_command_receive_data *obj = &command->receive_data;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3253,7 +3373,7 @@ static enum stk_command_parse_result parse_receive_data(
command->destructor = destroy_receive_data;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
@@ -3265,6 +3385,14 @@ static enum stk_command_parse_result parse_receive_data(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_send_data(struct stk_command *command)
@@ -3278,6 +3406,7 @@ static enum stk_command_parse_result parse_send_data(
struct comprehension_tlv_iter *iter)
{
struct stk_command_send_data *obj = &command->send_data;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3288,7 +3417,7 @@ static enum stk_command_parse_result parse_send_data(
command->destructor = destroy_send_data;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
@@ -3300,6 +3429,14 @@ static enum stk_command_parse_result parse_send_data(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static enum stk_command_parse_result parse_get_channel_status(
@@ -3461,6 +3598,7 @@ static enum stk_command_parse_result parse_retrieve_mms(
struct comprehension_tlv_iter *iter)
{
struct stk_command_retrieve_mms *obj = &command->retrieve_mms;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3470,7 +3608,7 @@ static enum stk_command_parse_result parse_retrieve_mms(
command->destructor = destroy_retrieve_mms;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
@@ -3490,6 +3628,14 @@ static enum stk_command_parse_result parse_retrieve_mms(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_submit_mms(struct stk_command *command)
@@ -3505,6 +3651,7 @@ static enum stk_command_parse_result parse_submit_mms(
struct comprehension_tlv_iter *iter)
{
struct stk_command_submit_mms *obj = &command->submit_mms;
+ enum stk_command_parse_result result;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
@@ -3514,7 +3661,7 @@ static enum stk_command_parse_result parse_submit_mms(
command->destructor = destroy_submit_mms;
- return parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
+ result = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
@@ -3528,6 +3675,14 @@ static enum stk_command_parse_result parse_submit_mms(
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
+
+ if (result != STK_PARSE_RESULT_OK)
+ return result;
+
+ if (check_text_and_icon(obj->alpha_id, obj->icon_id.id) == FALSE)
+ result = STK_PARSE_RESULT_DATA_NOT_UNDERSTOOD;
+
+ return result;
}
static void destroy_display_mms(struct stk_command *command)
--
1.7.0.4