aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mount.c
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2016-06-13 18:05:11 -0700
committerMichael Mann <mmann78@netscape.net>2016-06-15 01:56:04 +0000
commit22fd85d178e52b23a192737f16957d24886d0a5d (patch)
tree5d05d149739bd8063893031f753619917d7b60cb /epan/dissectors/packet-mount.c
parenteb4ed5a53c87d89832f5902cf9dca32b6f3370dc (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.c39
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);
}
}
}