aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2017-04-12 10:24:12 +0200
committerPascal Quantin <pascal.quantin@gmail.com>2017-04-12 10:00:50 +0000
commit5be11a5984c32e592e773c3049342861d4f30db1 (patch)
tree85f0c9984e135dc217167ad901be8948ed6be0fc /epan/dissectors
parent4d2d42310610e736f23466472ca5dd70b7655c7f (diff)
GSM SMS: also consider source and destination address for reassembly
Change-Id: I68ca00c970828311392565882bd7e4803df9818a Reviewed-on: https://code.wireshark.org/review/21032 Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-gsm_sms.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c
index cb3bde0b23..c3bb2a0b34 100644
--- a/epan/dissectors/packet-gsm_sms.c
+++ b/epan/dissectors/packet-gsm_sms.c
@@ -337,8 +337,10 @@ typedef struct {
} sm_fragment_params;
typedef struct {
- const gchar *address;
+ const gchar *tp_oa_or_tp_da;
int p2p_dir;
+ address src;
+ address dst;
guint32 id;
} sm_fragment_params_key;
@@ -348,7 +350,7 @@ sm_fragment_params_hash(gconstpointer k)
const sm_fragment_params_key* key = (const sm_fragment_params_key*) k;
guint hash_val;
- hash_val = (wmem_str_hash(key->address) ^ key->id) + key->p2p_dir;
+ hash_val = (wmem_str_hash(key->tp_oa_or_tp_da) ^ key->id) + key->p2p_dir;
return hash_val;
}
@@ -361,12 +363,16 @@ sm_fragment_params_equal(gconstpointer v1, gconstpointer v2)
return (key1->id == key2->id) &&
(key1->p2p_dir == key2->p2p_dir) &&
- !g_strcmp0(key1->address, key2->address);
+ !g_strcmp0(key1->tp_oa_or_tp_da, key2->tp_oa_or_tp_da) &&
+ addresses_equal(&key1->src, &key2->src) &&
+ addresses_equal(&key1->dst, &key2->dst);
}
typedef struct {
- const gchar *address;
+ const gchar *tp_oa_or_tp_da;
int p2p_dir;
+ address src;
+ address dst;
guint32 id;
} sm_fragment_key;
@@ -376,7 +382,7 @@ sm_fragment_hash(gconstpointer k)
const sm_fragment_key* key = (const sm_fragment_key*) k;
guint hash_val;
- hash_val = (wmem_str_hash(key->address) ^ key->id) + key->p2p_dir;
+ hash_val = (wmem_str_hash(key->tp_oa_or_tp_da) ^ key->id) + key->p2p_dir;
return hash_val;
}
@@ -389,7 +395,9 @@ sm_fragment_equal(gconstpointer k1, gconstpointer k2)
return (key1->id == key2->id) &&
(key1->p2p_dir == key2->p2p_dir) &&
- !g_strcmp0(key1->address, key2->address);
+ !g_strcmp0(key1->tp_oa_or_tp_da, key2->tp_oa_or_tp_da) &&
+ addresses_equal(&key1->src, &key2->src) &&
+ addresses_equal(&key1->dst, &key2->dst);
}
static gpointer
@@ -399,8 +407,10 @@ sm_fragment_temporary_key(const packet_info *pinfo,
const gchar* addr = (const char*)data;
sm_fragment_key *key = g_slice_new(sm_fragment_key);
- key->address = addr;
+ key->tp_oa_or_tp_da = addr;
key->p2p_dir = pinfo->p2p_dir;
+ copy_address_shallow(&key->src, &pinfo->src);
+ copy_address_shallow(&key->dst, &pinfo->dst);
key->id = id;
return (gpointer)key;
@@ -413,8 +423,10 @@ sm_fragment_persistent_key(const packet_info *pinfo,
const gchar* addr = (const char*)data;
sm_fragment_key *key = g_slice_new(sm_fragment_key);
- key->address = wmem_strdup(NULL, addr);
+ key->tp_oa_or_tp_da = wmem_strdup(NULL, addr);
key->p2p_dir = pinfo->p2p_dir;
+ copy_address(&key->src, &pinfo->src);
+ copy_address(&key->dst, &pinfo->dst);
key->id = id;
return (gpointer)key;
@@ -435,7 +447,9 @@ sm_fragment_free_persistent_key(gpointer ptr)
sm_fragment_key *key = (sm_fragment_key *)ptr;
if(key) {
- wmem_free(NULL, (void*)key->address);
+ wmem_free(NULL, (void*)key->tp_oa_or_tp_da);
+ free_address(&key->src);
+ free_address(&key->dst);
g_slice_free(sm_fragment_key, key);
}
}
@@ -2016,8 +2030,10 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
if (!PINFO_FD_VISITED(pinfo)) {
/* Store udl and length for later decoding of reassembled SMS */
p_frag_params_key = wmem_new(wmem_file_scope(), sm_fragment_params_key);
- p_frag_params_key->address = wmem_strdup(wmem_file_scope(), addr);
+ p_frag_params_key->tp_oa_or_tp_da = wmem_strdup(wmem_file_scope(), addr);
p_frag_params_key->p2p_dir = pinfo->p2p_dir;
+ copy_address_wmem(wmem_file_scope(), &p_frag_params_key->src, &pinfo->src);
+ copy_address_wmem(wmem_file_scope(), &p_frag_params_key->dst, &pinfo->dst);
p_frag_params_key->id = (udh_fields.sm_id<<16)|(udh_fields.frag-1);
p_frag_params = wmem_new0(wmem_file_scope(), sm_fragment_params);
p_frag_params->udl = udl;
@@ -2066,8 +2082,10 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
total_sms_len = 0;
for(i = 0 ; i < udh_fields.frags; i++)
{
- frag_params_key.address = addr;
+ frag_params_key.tp_oa_or_tp_da = addr;
frag_params_key.p2p_dir = pinfo->p2p_dir;
+ copy_address_shallow(&frag_params_key.src, &pinfo->src);
+ copy_address_shallow(&frag_params_key.dst, &pinfo->dst);
frag_params_key.id = (udh_fields.sm_id<<16)|i;
p_frag_params = (sm_fragment_params*)wmem_map_lookup(g_sm_fragment_params_table,
&frag_params_key);
@@ -2097,8 +2115,10 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
total_sms_len = 0;
for(i = 0 ; i < udh_fields.frags; i++)
{
- frag_params_key.address = addr;
+ frag_params_key.tp_oa_or_tp_da = addr;
frag_params_key.p2p_dir = pinfo->p2p_dir;
+ copy_address_shallow(&frag_params_key.src, &pinfo->src);
+ copy_address_shallow(&frag_params_key.dst, &pinfo->dst);
frag_params_key.id = (udh_fields.sm_id<<16)|i;
p_frag_params = (sm_fragment_params*)wmem_map_lookup(g_sm_fragment_params_table,
&frag_params_key);
@@ -2145,8 +2165,10 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
total_sms_len = 0;
for(i = 0 ; i < udh_fields.frags; i++)
{
- frag_params_key.address = addr;
+ frag_params_key.tp_oa_or_tp_da = addr;
frag_params_key.p2p_dir = pinfo->p2p_dir;
+ copy_address_shallow(&frag_params_key.src, &pinfo->src);
+ copy_address_shallow(&frag_params_key.dst, &pinfo->dst);
frag_params_key.id = (udh_fields.sm_id<<16)|i;
p_frag_params = (sm_fragment_params*)wmem_map_lookup(g_sm_fragment_params_table,
&frag_params_key);