diff options
author | Martin Kaiser <wireshark@kaiser.cx> | 2016-06-13 18:05:11 -0700 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-06-15 01:56:04 +0000 |
commit | 22fd85d178e52b23a192737f16957d24886d0a5d (patch) | |
tree | 5d05d149739bd8063893031f753619917d7b60cb /epan/dissectors/packet-mount.c | |
parent | eb4ed5a53c87d89832f5902cf9dca32b6f3370dc (diff) |
mount: fix a memory leak
don't copy the wmem-buffer from address_to_str() into a g_malloc()ed one
that is never freed
instead, realloc the wmem-buffer and add the nfs path to it
(nfs_name_snoop_add_name() will make a copy internally)
Change-Id: I4274a4a413c09f3f1d78beba65d94748ce185413
Reviewed-on: https://code.wireshark.org/review/15902
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-mount.c')
-rw-r--r-- | epan/dissectors/packet-mount.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/epan/dissectors/packet-mount.c b/epan/dissectors/packet-mount.c index 8b82c0e8b9..bc1552e18c 100644 --- a/epan/dissectors/packet-mount.c +++ b/epan/dissectors/packet-mount.c @@ -162,24 +162,27 @@ dissect_mount_dirpath_call(tvbuff_t *tvb, packet_info *pinfo, rpc_call_info_value *civ=(rpc_call_info_value *)data; if(civ->request && (civ->proc==1)){ - const gchar *host; - unsigned char *name; - guint32 len; - unsigned char *ptr; - - host=address_to_str(wmem_packet_scope(), &pinfo->dst); - len=tvb_get_ntohl(tvb, offset); - if (len < ITEM_LABEL_LENGTH) { - name=(unsigned char *)g_malloc(strlen(host)+1+len+1+200); - ptr=name; - memcpy(ptr, host, strlen(host)); - ptr+=strlen(host); - *ptr++=':'; - tvb_memcpy(tvb, ptr, offset+4, len); - ptr+=len; - *ptr=0; - - nfs_name_snoop_add_name(civ->xid, tvb, -1, (gint)strlen(name), 0, 0, name); + guint32 len_field; + + len_field = tvb_get_ntohl(tvb, offset); + if (len_field < ITEM_LABEL_LENGTH) { + gchar *name, *ptr; + int addr_len, name_len; + + name = address_to_str(wmem_packet_scope(), &pinfo->dst); + addr_len = (int)strlen(name); + /* IP address, colon, path, terminating 0 */ + name_len = addr_len + 1 + len_field + 1; + + name = (gchar *)wmem_realloc(wmem_packet_scope(), + (void *)name, name_len); + ptr = name + addr_len; + *ptr++ = ':'; + tvb_memcpy(tvb, ptr, offset+4, len_field); + ptr += len_field; + *ptr = 0; + + nfs_name_snoop_add_name(civ->xid, tvb, -1, name_len, 0, 0, name); } } } |