aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-etsi_card_app_toolkit.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-12-05 06:23:17 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-12-05 06:23:17 +0000
commit03085a5c9a2550b2ecda441bff77c2f9b1fcad0e (patch)
tree07ce60d88a3a6485ebaf702ccda962967e99d4b3 /epan/dissectors/packet-etsi_card_app_toolkit.c
parent8d0dc9f935ec01eb2890251ac4e683d157638a22 (diff)
Fix https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9503 :
Fix dissection of STK SEND SHORT MESSAGE proactive command svn path=/trunk/; revision=53793
Diffstat (limited to 'epan/dissectors/packet-etsi_card_app_toolkit.c')
-rw-r--r--epan/dissectors/packet-etsi_card_app_toolkit.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/epan/dissectors/packet-etsi_card_app_toolkit.c b/epan/dissectors/packet-etsi_card_app_toolkit.c
index ae68b52a30..1274fbed2a 100644
--- a/epan/dissectors/packet-etsi_card_app_toolkit.c
+++ b/epan/dissectors/packet-etsi_card_app_toolkit.c
@@ -898,18 +898,20 @@ static const value_string aid_pix_app_code_3gpp2_vals[] = {
{ 0, NULL}
};
-static void
-dissect_cat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+static int
+dissect_cat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
proto_item *cat_ti;
proto_tree *cat_tree, *elem_tree;
unsigned int pos = 0;
tvbuff_t *new_tvb;
gboolean ims_event = FALSE;
+ guint length = tvb_length(tvb);
+ gsm_sms_data_t sms_data;
cat_ti = proto_tree_add_item(tree, proto_cat, tvb, 0, -1, ENC_NA);
cat_tree = proto_item_add_subtree(cat_ti, ett_cat);
- while (pos < tvb_length(tvb)) {
+ while (pos < length) {
proto_item *ti;
guint8 g8;
guint16 tag;
@@ -966,6 +968,7 @@ dissect_cat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
break;
case 0x13:
proto_tree_add_item(elem_tree, hf_ctlv_cmd_qual_send_short_msg, tvb, pos+2, 1, ENC_NA);
+ sms_data.stk_packing_required = tvb_get_guint8(tvb, pos+2) & 0x01 ? TRUE : FALSE;
break;
case 0x26:
proto_tree_add_item(elem_tree, hf_ctlv_cmd_qual_loci, tvb, pos+2, 1, ENC_NA);
@@ -1031,7 +1034,17 @@ dissect_cat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
case 0x0b: /* sms tpdu */
new_tvb = tvb_new_subset(tvb, pos, len, len);
if (new_tvb) {
- call_dissector_only(gsm_sms_handle, new_tvb, pinfo, elem_tree, NULL);
+ int p2p_dir_save = pinfo->p2p_dir;
+ if (data) {
+ if (GPOINTER_TO_INT(data) == 0xd0) {
+ /* Proactive command */
+ pinfo->p2p_dir = P2P_DIR_RECV;
+ } else {
+ pinfo->p2p_dir = P2P_DIR_SENT;
+ }
+ }
+ call_dissector_only(gsm_sms_handle, new_tvb, pinfo, elem_tree, &sms_data);
+ pinfo->p2p_dir = p2p_dir_save;
}
break;
case 0x0d: /* text string */
@@ -1321,9 +1334,9 @@ dissect_cat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
default:
break;
}
-
pos += len;
}
+ return length;
}
void
@@ -1783,7 +1796,7 @@ proto_register_card_app_toolkit(void)
proto_register_subtree_array(ett, array_length(ett));
- register_dissector("etsi_cat", dissect_cat, proto_cat);
+ new_register_dissector("etsi_cat", dissect_cat, proto_cat);
}
/* This function is called once at startup and every time the user hits