diff --git a/epan/dissectors/asn1/idmp/idmp.cnf b/epan/dissectors/asn1/idmp/idmp.cnf index c1cf78b13a..709eead110 100644 --- a/epan/dissectors/asn1/idmp/idmp.cnf +++ b/epan/dissectors/asn1/idmp/idmp.cnf @@ -35,6 +35,9 @@ IdmResult/invokeID ABBREV=idmResult.invokeID #.FN_PARS OBJECT_IDENTIFIER FN_VARIANT = _str VAL_PTR = &protocolID +#.FN_FTR IdmBind + saved_protocolID = wmem_strdup(wmem_epan_scope(), protocolID); +#.END #.FN_BODY IdmBindResult/result struct SESSION_DATA_STRUCTURE *session = (struct SESSION_DATA_STRUCTURE*)actx->private_data; diff --git a/epan/dissectors/asn1/idmp/packet-idmp-template.c b/epan/dissectors/asn1/idmp/packet-idmp-template.c index 978b850434..dbe118867d 100644 --- a/epan/dissectors/asn1/idmp/packet-idmp-template.c +++ b/epan/dissectors/asn1/idmp/packet-idmp-template.c @@ -100,14 +100,14 @@ static int call_idmp_oid_callback(tvbuff_t *tvb, int offset, packet_info *pinfo, { if(session != NULL) { - if((!saved_protocolID) && (op == (ROS_OP_BIND | ROS_OP_RESULT))) { - /* save for subsequent operations - should be into session data */ - saved_protocolID = wmem_strdup(wmem_file_scope(), protocolID); + /* XXX saved_protocolID should be part of session data */ + if (!saved_protocolID) { + saved_protocolID = "[ unknown ]"; } /* mimic ROS! */ session->ros_op = op; - offset = call_ros_oid_callback(saved_protocolID ? saved_protocolID : protocolID, tvb, offset, pinfo, tree, session); + offset = call_ros_oid_callback(saved_protocolID, tvb, offset, pinfo, tree, session); } return offset; @@ -234,8 +234,8 @@ static int dissect_idmp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *paren static void idmp_reassemble_cleanup(void) { - protocolID = NULL; - saved_protocolID = NULL; + protocolID = NULL; // packet scoped + saved_protocolID = NULL; // epan scoped copy of protocolID opcode = -1; } diff --git a/epan/dissectors/packet-idmp.c b/epan/dissectors/packet-idmp.c index 5c0ed0d8a4..a307df65d3 100644 --- a/epan/dissectors/packet-idmp.c +++ b/epan/dissectors/packet-idmp.c @@ -108,14 +108,14 @@ static int call_idmp_oid_callback(tvbuff_t *tvb, int offset, packet_info *pinfo, { if(session != NULL) { - if((!saved_protocolID) && (op == (ROS_OP_BIND | ROS_OP_RESULT))) { - /* save for subsequent operations - should be into session data */ - saved_protocolID = wmem_strdup(wmem_file_scope(), protocolID); + /* XXX saved_protocolID should be part of session data */ + if (!saved_protocolID) { + saved_protocolID = "[ unknown ]"; } /* mimic ROS! */ session->ros_op = op; - offset = call_ros_oid_callback(saved_protocolID ? saved_protocolID : protocolID, tvb, offset, pinfo, tree, session); + offset = call_ros_oid_callback(saved_protocolID, tvb, offset, pinfo, tree, session); } return offset; @@ -218,6 +218,7 @@ dissect_idmp_IdmBind(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, IdmBind_sequence, hf_index, ett_idmp_IdmBind); + saved_protocolID = wmem_strdup(wmem_epan_scope(), protocolID); return offset; } @@ -720,8 +721,8 @@ static int dissect_idmp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *paren static void idmp_reassemble_cleanup(void) { - protocolID = NULL; - saved_protocolID = NULL; + protocolID = NULL; // packet scoped + saved_protocolID = NULL; // epan scoped copy of protocolID opcode = -1; }