wiretap: fix memory leak of interface_data for wtap_dumper
authorPeter Wu <peter@lekensteyn.nl>
Fri, 9 Sep 2016 23:12:58 +0000 (01:12 +0200)
committerPeter Wu <peter@lekensteyn.nl>
Sat, 10 Sep 2016 12:59:47 +0000 (12:59 +0000)
Mirrors the behavior of wtap_close.

Change-Id: I1a04878fdd0409fa74931737332f9b8a1ae77fb1
Reviewed-on: https://code.wireshark.org/review/17620
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
wiretap/file_access.c
wiretap/wtap.h

index 434ec1249059bdf4b2bfb763ed7c8ec0dc983536..eda6c492d90e84b137b768aae01dad6014633a6d 100644 (file)
@@ -2204,7 +2204,8 @@ wtap_dump_init_dumper(int file_type_subtype, int encap, int snaplen, gboolean co
        if ((idb_inf != NULL) && (idb_inf->interface_data->len > 0)) {
                guint itf_count;
 
-               /* XXX: what free's this stuff? */
+               /* Note: this memory is owned by wtap_dumper and will become
+                * invalid after wtap_dump_close. */
                wdh->interface_data = g_array_new(FALSE, FALSE, sizeof(wtap_block_t));
                for (itf_count = 0; itf_count < idb_inf->interface_data->len; itf_count++) {
                        file_int_data = g_array_index(idb_inf->interface_data, wtap_block_t, itf_count);
@@ -2574,6 +2575,7 @@ wtap_dump_close(wtap_dumper *wdh, int *err)
        }
        if (wdh->priv != NULL)
                g_free(wdh->priv);
+       wtap_block_array_free(wdh->interface_data);
        g_free(wdh);
        return ret;
 }
index 7a8b1d94c253d640cf4b2559b53b55fa5ec47d5c..63787292bae5b092d16a0b89667aea0ae3492d53 100644 (file)
@@ -1713,9 +1713,11 @@ void wtap_fdclose(wtap *wth);
 WS_DLL_PUBLIC
 gboolean wtap_fdreopen(wtap *wth, const char *filename, int *err);
 
-/*** close the current file ***/
+/** Close only the sequential side, freeing up memory it uses. */
 WS_DLL_PUBLIC
 void wtap_sequential_close(wtap *wth);
+
+/** Closes any open file handles and frees the memory associated with wth. */
 WS_DLL_PUBLIC
 void wtap_close(wtap *wth);
 
@@ -1874,8 +1876,13 @@ void wtap_set_bytes_dumped(wtap_dumper *wdh, gint64 bytes_dumped);
 struct addrinfo;
 WS_DLL_PUBLIC
 gboolean wtap_dump_set_addrinfo_list(wtap_dumper *wdh, addrinfo_lists_t *addrinfo_lists);
+
+/**
+ * Closes open file handles and frees memory associated with wdh. Note that
+ * shb_hdr, idb_inf and nrb_hdr are not freed by this routine.
+ */
 WS_DLL_PUBLIC
-gboolean wtap_dump_close(wtap_dumper *, int *);
+gboolean wtap_dump_close(wtap_dumper *wdh, int *err);
 
 /**
  * Return TRUE if we can write a file out with the given GArray of file