diff options
author | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2006-05-03 10:59:15 +0000 |
---|---|---|
committer | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2006-05-03 10:59:15 +0000 |
commit | c18467254d0cd353d79b77d7d1124b7e564ef4e2 (patch) | |
tree | 106a54547d3714bf9d90c5a1779d3387de321f63 /asn1 | |
parent | ac146caf5cd3a5034ce38012254889a06b9dda87 (diff) | |
download | wireshark-c18467254d0cd353d79b77d7d1124b7e564ef4e2.tar.gz wireshark-c18467254d0cd353d79b77d7d1124b7e564ef4e2.tar.bz2 wireshark-c18467254d0cd353d79b77d7d1124b7e564ef4e2.zip |
do some template magic to make ethereal dissect CLDAP RPC again.
i dont think it is the optimal way to solve this but it is better than nothing for the time being.
svn path=/trunk/; revision=18083
Diffstat (limited to 'asn1')
-rw-r--r-- | asn1/ldap/ldap.cnf | 32 | ||||
-rw-r--r-- | asn1/ldap/packet-ldap-template.c | 79 |
2 files changed, 84 insertions, 27 deletions
diff --git a/asn1/ldap/ldap.cnf b/asn1/ldap/ldap.cnf index e85d60758c..81e41ac225 100644 --- a/asn1/ldap/ldap.cnf +++ b/asn1/ldap/ldap.cnf @@ -337,33 +337,6 @@ ldap_conv_info_t *ldap_info; proto_item_append_text(ldm_tree, " %%s", valstr); } - - -#.FN_PARS AttributeValue VAL_PTR = ¶meter_tvb - -#.FN_BODY AttributeValue - - tvbuff_t *parameter_tvb; - gchar *string; - guint32 i, len; - proto_item *pi; - - %(DEFAULT_BODY)s - - len = tvb_length_remaining(parameter_tvb, 0); - - for(i = 0; i < len; i++) - if(!g_ascii_isprint(tvb_get_guint8(parameter_tvb, i))) - break; - - if(i == len) { - string = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb, 0)); - - pi = get_ber_last_created_item(); - - proto_item_set_text(pi, string); - - } #.FN_PARS AuthenticationChoice VAL_PTR = &branch @@ -395,3 +368,8 @@ ldap_conv_info_t *ldap_info; %(DEFAULT_BODY)s ldap_do_protocolop(pinfo); + +#.NO_EMIT +AttributeDescription +AttributeValue + diff --git a/asn1/ldap/packet-ldap-template.c b/asn1/ldap/packet-ldap-template.c index c721c5748c..d081e510c0 100644 --- a/asn1/ldap/packet-ldap-template.c +++ b/asn1/ldap/packet-ldap-template.c @@ -621,8 +621,87 @@ static void dissect_mscldap_response(proto_tree *tree, tvbuff_t *tvb, guint32 rp } } +static int dissect_ldap_AttributeDescription(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_); +static int dissect_ldap_AttributeValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_); + +static int mscldap_rpc_call=0; + #include "packet-ldap-fn.c" +static int +dissect_ldap_AttributeValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + tvbuff_t *parameter_tvb; + gchar *string; + guint32 i, len; + proto_item *pi; + ldap_conv_info_t *ldap_info; + + ldap_info=(ldap_conv_info_t *)pinfo->private_data; + /* if this is cldap then this might hold the RPC reply + */ + if(ldap_info && ldap_info->is_mscldap && mscldap_rpc_call){ + + offset = dissect_ber_octet_string(implicit_tag, pinfo, NULL, tvb, offset, hf_index, ¶meter_tvb); + dissect_mscldap_response(tree, parameter_tvb, mscldap_rpc_call); + mscldap_rpc_call=0; + + return offset; + } + + offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, + ¶meter_tvb); + + + len = tvb_length_remaining(parameter_tvb, 0); + + for(i = 0; i < len; i++) + if(!g_ascii_isprint(tvb_get_guint8(parameter_tvb, i))) + break; + + if(i == len) { + string = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb, 0)); + + pi = get_ber_last_created_item(); + + proto_item_set_text(pi, string); + + } + + return offset; +} + +static int +dissect_ldap_AttributeDescription(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + tvbuff_t *parameter_tvb = NULL; + char *ldapstring=NULL; + ldap_conv_info_t *ldap_info; + + ldap_info=(ldap_conv_info_t *)pinfo->private_data; + + /* if this is cldap then this holds the name of the RPC function called + * and we have to remember it until the value is dissected. + */ + if(ldap_info && ldap_info->is_mscldap){ + mscldap_rpc_call=0; + dissect_ber_octet_string(implicit_tag, pinfo, NULL, tvb, offset, hf_index, + ¶meter_tvb); + if(parameter_tvb){ + ldapstring = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb, 0)); + } + + if(ldapstring){ + if(!strcmp(ldapstring, "netlogon")){ + mscldap_rpc_call=MSCLDAP_RPC_NETLOGON; + } + g_free(ldapstring); + } + } + + offset = dissect_ldap_LDAPString(implicit_tag, tvb, offset, pinfo, tree, hf_index); + + return offset; +} + static void dissect_ldap_payload(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ldap_conv_info_t *ldap_info, |