diff options
author | Kovarththanan Rajaratnam <kovarththanan.rajaratnam@gmail.com> | 2009-09-20 13:36:16 +0000 |
---|---|---|
committer | Kovarththanan Rajaratnam <kovarththanan.rajaratnam@gmail.com> | 2009-09-20 13:36:16 +0000 |
commit | ebaaada38238e8e1a4cee39572220a8396378df7 (patch) | |
tree | 14eaffa5d98eaaec18d22faab16f64bc002fa858 | |
parent | afe5b2fe9dae76b4d8ede5172b803fcc935b1589 (diff) |
Only duplicate string the first time around, i.e. 'pinfo->fd->flags.visited == FALSE' or else we end up leaking memory
svn path=/trunk/; revision=30013
-rw-r--r-- | epan/dissectors/packet-smb.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/epan/dissectors/packet-smb.c b/epan/dissectors/packet-smb.c index c013991f64..6ea6793c7f 100644 --- a/epan/dissectors/packet-smb.c +++ b/epan/dissectors/packet-smb.c @@ -2503,7 +2503,7 @@ dissect_negprot_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, in static int -dissect_old_dir_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, proto_tree *smb_tree _U_) +dissect_old_dir_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, proto_tree *smb_tree _U_) { smb_info_t *si = pinfo->private_data; int dn_len; @@ -2526,7 +2526,7 @@ dissect_old_dir_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, dn = get_unicode_or_ascii_string(tvb, &offset, si->unicode, &dn_len, FALSE, FALSE, &bc); - if(si->sip){ + if((!pinfo->fd->flags.visited) && si->sip){ si->sip->extra_info_type=SMB_EI_FILENAME; si->sip->extra_info=se_strdup(dn); } @@ -3777,7 +3777,7 @@ dissect_delete_file_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, fn = get_unicode_or_ascii_string(tvb, &offset, si->unicode, &fn_len, FALSE, FALSE, &bc); - if(si->sip){ + if((!pinfo->fd->flags.visited) && si->sip){ si->sip->extra_info_type=SMB_EI_FILENAME; si->sip->extra_info=se_strdup(fn); } @@ -10982,7 +10982,7 @@ dissect_dfs_inconsistency_data(tvbuff_t *tvb, packet_info *pinfo, } static int -dissect_dfs_referral_strings(tvbuff_t *tvb, proto_tree *tree, int hfindex, +dissect_dfs_referral_strings(tvbuff_t *tvb, proto_tree *tree, int hfindex, int nstring, int stroffset, int oldoffset, int offset, guint16 bc, gboolean unicode, int *end) { @@ -11005,13 +11005,13 @@ dissect_dfs_referral_strings(tvbuff_t *tvb, proto_tree *tree, int hfindex, *end = stroffset; } } - + return offset; } static int -dissect_dfs_referral_string(tvbuff_t *tvb, proto_tree *tree, int hfindex, +dissect_dfs_referral_string(tvbuff_t *tvb, proto_tree *tree, int hfindex, int stroffset, int oldoffset, int offset, guint16 bc, gboolean unicode, int *end) { @@ -11024,7 +11024,7 @@ static int dissect_dfs_referral_entry_v2(tvbuff_t *tvb, proto_tree *tree, int oldoffset, int offset, guint16 refflags _U_, guint16 *bcp, gboolean unicode, int *ucstring_end) { - + guint16 pathoffset; guint16 altpathoffset; guint16 nodeoffset; @@ -11059,7 +11059,7 @@ dissect_dfs_referral_entry_v2(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in /* path */ if (pathoffset) { - dissect_dfs_referral_string(tvb, tree, hf_smb_dfs_referral_path, + dissect_dfs_referral_string(tvb, tree, hf_smb_dfs_referral_path, pathoffset+oldoffset, oldoffset, offset, *bcp, unicode, ucstring_end); } @@ -11084,7 +11084,7 @@ dissect_dfs_referral_entry_v2(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in static int -dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, int offset, +dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, int offset, guint16 refflags, guint16 *bcp, gboolean unicode, int *ucstring_end) { guint16 domoffset; @@ -11098,8 +11098,8 @@ dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in CHECK_BYTE_COUNT_TRANS_SUBR(4); proto_tree_add_item(tree, hf_smb_dfs_referral_ttl, tvb, offset, 4, TRUE); COUNT_BYTES_TRANS_SUBR(4); - - if (refflags & REFENT_FLAGS_NAME_LIST_REFERRAL) { + + if (refflags & REFENT_FLAGS_NAME_LIST_REFERRAL) { /* domain name offset */ CHECK_BYTE_COUNT_TRANS_SUBR(2); domoffset = tvb_get_letohs(tvb, offset); @@ -11117,11 +11117,11 @@ dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in expoffset = tvb_get_letohs(tvb, offset); proto_tree_add_uint(tree, hf_smb_dfs_referral_expnames_offset, tvb, offset, 2, expoffset); COUNT_BYTES_TRANS_SUBR(2); - - /* padding: zero or 16 bytes, which should be ignored by clients. + + /* padding: zero or 16 bytes, which should be ignored by clients. * we ignore them too. */ - + /* domain name */ if (domoffset) { dissect_dfs_referral_string(tvb, tree, hf_smb_dfs_referral_domain_name, @@ -11132,7 +11132,7 @@ dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in if (expoffset) { proto_item *expitem = NULL; proto_tree *exptree = NULL; - + expitem = proto_tree_add_text(tree, tvb, offset, *bcp, "Expanded Names"); exptree = proto_item_add_subtree(expitem, ett_smb_dfs_referral_expnames); @@ -11166,7 +11166,7 @@ dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in /* path */ if (pathoffset) { - dissect_dfs_referral_string(tvb, tree, hf_smb_dfs_referral_path, + dissect_dfs_referral_string(tvb, tree, hf_smb_dfs_referral_path, pathoffset+oldoffset, oldoffset, offset, *bcp, unicode, ucstring_end); } @@ -11299,12 +11299,12 @@ dissect_get_dfs_referral_data(tvbuff_t *tvb, packet_info *pinfo, offset = dissect_dfs_referral_entry_v2(tvb, rt, old_offset, offset, refflags, bcp, si->unicode, &ucstring_end); break; - case 3: + case 3: offset = dissect_dfs_referral_entry_v3(tvb, rt, old_offset, offset, refflags, bcp, si->unicode, &ucstring_end); break; case 4: - /* V4 is extactly same as V3, except the version number and + /* V4 is extactly same as V3, except the version number and * one more ReferralEntryFlags */ offset = dissect_dfs_referral_entry_v3(tvb, rt, old_offset, offset, refflags, bcp, si->unicode, &ucstring_end); |