Workarounded cabextract memory leaks by captive memory tracker object.
[captive.git] / src / install / acquire / cabinet.c
index ade7d80..a748492 100644 (file)
@@ -32,6 +32,7 @@
 #include <signal.h>
 #include <setjmp.h>
 #include <sys/time.h>
+#include "cabinet-memory.h"
 
 #include <captive/macros.h>
 
@@ -287,6 +288,7 @@ struct acquire_cabinet *r;
        acquire_cabinet_set_uri(r,uri);
        r->cabinet_done=0;
        r->cabinet_used=cabinet_used;
+       r->memory=acquire_cabinet_memory_object_new();
 
        return r;
 }
@@ -347,6 +349,7 @@ href_done:;
 
        acquire_cabinet_set_uri(r,uri);
        gnome_vfs_uri_unref(uri);
+       r->memory=acquire_cabinet_memory_object_new();
 
        return r;
 }
@@ -362,6 +365,7 @@ void acquire_cabinet_free(struct acquire_cabinet *acquire_cabinet)
        g_free((/* de-const */ gchar *)acquire_cabinet->filename);
        gnome_vfs_uri_unref(acquire_cabinet->uri);
        gnome_vfs_uri_unref(acquire_cabinet->handle_uri);
+       g_object_unref(acquire_cabinet->memory);
        g_free(acquire_cabinet);
 }
 
@@ -397,13 +401,15 @@ struct file *filelist,*fi;
        if ((*ui_progress)(acquire_cabinet->uri))
                return;
 
+       acquire_cabinet_memory_object_push(acquire_cabinet->memory);
+
        basecab=find_cabs_in_file(acquire_cabinet);
        if (!basecab)
-               return;
+               goto fail_memory_pop;
        if (basecab->next)
-               return;
+               goto fail_memory_pop;
        if (basecab->prevcab || basecab->nextcab)
-               return;
+               goto fail_memory_pop;
 
        filelist=process_files(basecab);
 
@@ -418,7 +424,7 @@ int errint;
                uri_fi=gnome_vfs_uri_append_file_name(acquire_cabinet->uri,fi->filename);
                if ((*ui_progress)(uri_fi)) {
                        gnome_vfs_uri_unref(uri_fi);
-                       return;
+                       goto fail_memory_pop;
                        }
 
                file_write_fi_assertion=fi;
@@ -433,7 +439,7 @@ int errint;
                                        TRUE);  /* free_segment */
                        gnome_vfs_uri_unref(uri_fi);
                        if (!errint)
-                               return;
+                               goto fail_memory_pop;
                        continue;
                        }
                file_buffer=g_byte_array_free(file_write_bytearray,
@@ -442,4 +448,9 @@ int errint;
                gnome_vfs_uri_unref(uri_fi);
                g_free(file_buffer);
     }
+
+       /* FALLTHRU */
+
+fail_memory_pop:
+       acquire_cabinet_memory_object_pop(acquire_cabinet->memory);
 }