aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ansi_tcap.c
diff options
context:
space:
mode:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2007-09-13 20:20:11 +0000
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2007-09-13 20:20:11 +0000
commit4d413cb210de98c576401b35886aa52842005bb1 (patch)
treeabcb17a5d4c6650c2b2dfeb81ac6a0df7e04d37a /epan/dissectors/packet-ansi_tcap.c
parent58ce2d82dbe14f71ce22577d1cd594eb5e9b5e33 (diff)
Try to protect the hash table...
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@22866 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-ansi_tcap.c')
-rw-r--r--epan/dissectors/packet-ansi_tcap.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/epan/dissectors/packet-ansi_tcap.c b/epan/dissectors/packet-ansi_tcap.c
index 299325e8e5..01721b83bd 100644
--- a/epan/dissectors/packet-ansi_tcap.c
+++ b/epan/dissectors/packet-ansi_tcap.c
@@ -193,6 +193,7 @@ static void ansi_tcap_ctx_init(struct ansi_tcap_private_t *a_tcap_ctx) {
memset(a_tcap_ctx, '\0', sizeof(*a_tcap_ctx));
a_tcap_ctx->signature = ANSI_TCAP_CTX_SIGNATURE;
a_tcap_ctx->oid_is_present = FALSE;
+ a_tcap_ctx->TransactionID_str = NULL;
}
static void dissect_ansi_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree);
@@ -284,17 +285,23 @@ save_invoke_data(packet_info *pinfo, proto_tree *tree _U_, tvbuff_t *tvb _U_){
if ((!pinfo->fd->flags.visited)&&(ansi_tcap_private.TransactionID_str)){
/* Only do this once XXX I hope its the right thing to do */
- ansi_tcap_saved_invokedata = g_malloc(sizeof(ansi_tcap_saved_invokedata));
- ansi_tcap_saved_invokedata->OperationCode = ansi_tcap_private.d.OperationCode;
-
- ansi_tcap_saved_invokedata->OperationCode_national = ansi_tcap_private.d.OperationCode_national;
- ansi_tcap_saved_invokedata->OperationCode_private = ansi_tcap_private.d.OperationCode_private;
-
+ g_warning("Trans id=%s",ansi_tcap_private.TransactionID_str);
strcpy(buf, ansi_tcap_private.TransactionID_str);
/* The hash string needs to contain src and dest to distiguish differnt flows */
strcat(buf,src_str);
strcat(buf,dst_str);
strcat(buf,"\0");
+
+ /* If the entry allready exists don't owervrite it */
+ ansi_tcap_saved_invokedata = g_hash_table_lookup(TransactionId_table,buf);
+ if(ansi_tcap_saved_invokedata)
+ return;
+
+ ansi_tcap_saved_invokedata = g_malloc(sizeof(ansi_tcap_saved_invokedata));
+ ansi_tcap_saved_invokedata->OperationCode = ansi_tcap_private.d.OperationCode;
+ ansi_tcap_saved_invokedata->OperationCode_national = ansi_tcap_private.d.OperationCode_national;
+ ansi_tcap_saved_invokedata->OperationCode_private = ansi_tcap_private.d.OperationCode_private;
+
g_hash_table_insert(TransactionId_table,
g_strdup(buf),
ansi_tcap_saved_invokedata);
@@ -524,7 +531,8 @@ guint8 len;
if(next_tvb) {
- ansi_tcap_private.TransactionID_str = tvb_bytes_to_str(next_tvb, 0,tvb_length(next_tvb));
+ if(tvb_length(next_tvb) !=0)
+ ansi_tcap_private.TransactionID_str = tvb_bytes_to_str(next_tvb, 0,tvb_length(next_tvb));
len = tvb_length_remaining(next_tvb, 0);
switch(len) {
case 1:
@@ -1321,7 +1329,7 @@ dissect_ansi_tcap_PackageType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
/*--- End of included file: packet-ansi_tcap-fn.c ---*/
-#line 323 "packet-ansi_tcap-template.c"
+#line 330 "packet-ansi_tcap-template.c"
@@ -1654,7 +1662,7 @@ proto_register_ansi_tcap(void)
"ansi_tcap.T_paramSet", HFILL }},
/*--- End of included file: packet-ansi_tcap-hfarr.c ---*/
-#line 447 "packet-ansi_tcap-template.c"
+#line 454 "packet-ansi_tcap-template.c"
};
/* Setup protocol subtree array */
@@ -1691,7 +1699,7 @@ proto_register_ansi_tcap(void)
&ett_ansi_tcap_T_paramSet,
/*--- End of included file: packet-ansi_tcap-ettarr.c ---*/
-#line 457 "packet-ansi_tcap-template.c"
+#line 464 "packet-ansi_tcap-template.c"
};
/*static enum_val_t tcap_options[] = {