aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2006-01-22 16:47:16 +0000
committerUlf Lamping <ulf.lamping@web.de>2006-01-22 16:47:16 +0000
commit484325759683cad78c49de8a68bd57d031564133 (patch)
treee9ab9f800298616509768c775aec9d6c4a9b00fd
parent6f2c4c84c14b7c56d72abd648378ef6b3a9cc4da (diff)
add fragment_get_reassembled_id so the handed id doesn't need to be a packet number (experimental)
add a check to fragment_add_common() if the given tvb parameters are ok, otherwise throw a DissectorError add some more symbols to libethereal.def svn path=/trunk/; revision=17073
-rw-r--r--epan/libethereal.def2
-rw-r--r--epan/reassemble.c21
-rw-r--r--epan/reassemble.h4
3 files changed, 27 insertions, 0 deletions
diff --git a/epan/libethereal.def b/epan/libethereal.def
index 950c007d89..cfdf8a2dd7 100644
--- a/epan/libethereal.def
+++ b/epan/libethereal.def
@@ -256,6 +256,7 @@ fragment_add_seq_check
fragment_add_seq_next
fragment_delete
fragment_get
+fragment_get_reassembled_id
fragment_get_tot_len
fragment_set_partial_reassembly
fragment_set_tot_len
@@ -496,6 +497,7 @@ proto_tree_add_uint64
proto_tree_add_uint64_format
proto_tree_children_foreach
proto_tree_get_parent
+proto_tree_move_item
p_add_proto_data
p_get_proto_data
q931_cause_code_vals DATA
diff --git a/epan/reassemble.c b/epan/reassemble.c
index f7e1cfb588..6b93edae70 100644
--- a/epan/reassemble.c
+++ b/epan/reassemble.c
@@ -386,6 +386,7 @@ fragment_get(packet_info *pinfo, guint32 id, GHashTable *fragment_table)
return fd_head;
}
+/* id *must* be the frame number for this to work! */
fragment_data *
fragment_get_reassembled(packet_info *pinfo, guint32 id, GHashTable *reassembled_table)
{
@@ -400,6 +401,20 @@ fragment_get_reassembled(packet_info *pinfo, guint32 id, GHashTable *reassembled
return fd_head;
}
+fragment_data *
+fragment_get_reassembled_id(packet_info *pinfo, guint32 id, GHashTable *reassembled_table)
+{
+ fragment_data *fd_head;
+ reassembled_key key;
+
+ /* create key to search hash with */
+ key.frame = pinfo->fd->num;
+ key.id = id;
+ fd_head = g_hash_table_lookup(reassembled_table, &key);
+
+ return fd_head;
+}
+
/* This function can be used to explicitely set the total length (if known)
* for reassembly of a PDU.
* This is useful for reassembly of PDUs where one may have the total length specified
@@ -803,6 +818,12 @@ fragment_add_common(tvbuff_t *tvb, int offset, packet_info *pinfo, guint32 id,
fragment_data *fd_item;
gboolean already_added=pinfo->fd->flags.visited;
+
+ /* dissector shouldn't give us garbage tvb info */
+ if(!tvb_bytes_exist(tvb, offset, frag_data_len)) {
+ THROW(DissectorError);
+ }
+
/* create key to search hash with */
key.src = pinfo->src;
key.dst = pinfo->dst;
diff --git a/epan/reassemble.h b/epan/reassemble.h
index 69ebf94e1f..9c37cf058d 100644
--- a/epan/reassemble.h
+++ b/epan/reassemble.h
@@ -201,9 +201,13 @@ extern fragment_data *
fragment_get(packet_info *pinfo, guint32 id, GHashTable *fragment_table);
/* The same for the reassemble table */
+/* id *must* be the frame number for this to work! */
extern fragment_data *
fragment_get_reassembled(packet_info *pinfo, guint32 id, GHashTable *reassembled_table);
+extern fragment_data *
+fragment_get_reassembled_id(packet_info *pinfo, guint32 id, GHashTable *reassembled_table);
+
/* This will free up all resources and delete reassembly state for this PDU.
* Except if the PDU is completely reassembled, then it would NOT deallocate the
* buffer holding the reassembled data but instead return the pointer to that