r412 - trunk

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Jan 13 20:01:24 EST 2008


Author: icculus
Date: 2008-01-13 20:01:23 -0500 (Sun, 13 Jan 2008)
New Revision: 412

Modified:
   trunk/archive_tar.c
Log:
Fixed a FIXME: leaking MojoInputs from the tar archiver in corner cases.


Modified: trunk/archive_tar.c
===================================================================
--- trunk/archive_tar.c	2008-01-13 12:50:39 UTC (rev 411)
+++ trunk/archive_tar.c	2008-01-14 01:01:23 UTC (rev 412)
@@ -166,15 +166,21 @@
     return retval;
 } // MojoInput_gzip_duplicate
 
-static void MojoInput_gzip_close(MojoInput *io)
+static void free_gzip_input(MojoInput *io)
 {
     GZIPinfo *info = (GZIPinfo *) io->opaque;
-    if (info->origio != NULL)
-        info->origio->close(info->origio);
     inflateEnd(&info->stream);
     free(info->buffer);
     free(info);
     free(io);
+} // free_gzip_input
+
+static void MojoInput_gzip_close(MojoInput *io)
+{
+    GZIPinfo *info = (GZIPinfo *) io->opaque;
+    if (info->origio != NULL)
+        info->origio->close(info->origio);
+    free_gzip_input(io);
 } // MojoInput_gzip_close
 
 static MojoInput *make_gzip_input(MojoInput *origio)
@@ -374,15 +380,21 @@
     return retval;
 } // MojoInput_bzip2_duplicate
 
-static void MojoInput_bzip2_close(MojoInput *io)
+static void free_bzip2_input(MojoInput *io)
 {
     BZIP2info *info = (BZIP2info *) io->opaque;
-    if (info->origio != NULL)
-        info->origio->close(info->origio);
     BZ2_bzDecompressEnd(&info->stream);
     free(info->buffer);
     free(info);
     free(io);
+} // free_bzip2_input
+
+static void MojoInput_bzip2_close(MojoInput *io)
+{
+    BZIP2info *info = (BZIP2info *) io->opaque;
+    if (info->origio != NULL)
+        info->origio->close(info->origio);
+    free_bzip2_input(io);
 } // MojoInput_bzip2_close
 
 static MojoInput *make_bzip2_input(MojoInput *origio)
@@ -471,7 +483,7 @@
 static MojoInput *MojoInput_tar_duplicate(MojoInput *io)
 {
     MojoInput *retval = NULL;
-    fatal("BUG: Can't duplicate tar inputs");
+    fatal("BUG: Can't duplicate tar inputs");  // !!! FIXME: why not?
 #if 0
     TARinput *input = (TARinput *) io->opaque;
     MojoInput *origio = (MojoInput *) io->opaque;
@@ -711,11 +723,14 @@
 } // MojoArchive_tar_close
 
 
+static void free_wrapper_noop(MojoInput *io) {}
+
 MojoArchive *MojoArchive_createTAR(MojoInput *io)
 {
     MojoArchive *ar = NULL;
     uint8 sig[512];
     int64 br = io->read(io, sig, 4);
+    void (*free_wrapper)(MojoInput *io) = free_wrapper_noop;
 
     if ((!io->seek(io, 0)) || (br != 4))
         return NULL;
@@ -727,13 +742,19 @@
 
         #if SUPPORT_TAR_GZ   // gzip compressed?
         if ((sig[0] == 0x1F) && (sig[1] == 0x8B) && (sig[2] == 0x08))
+        {
+            free_wrapper = free_gzip_input;
             io = make_gzip_input(io);
+        } // if
         #endif
 
         // BZ2 compressed?
         #if SUPPORT_TAR_BZ2  // bzip2 compressed?
         if ((sig[0] == 0x42) && (sig[1] == 0x5A))
+        {
+            free_wrapper = free_bzip2_input;
             io = make_bzip2_input(io);
+        } // if
         #endif
     } // if
 
@@ -743,11 +764,17 @@
     //  these for years, so it's okay to ignore other ones, I guess.
     br = io->read(io, sig, sizeof (sig));  // potentially compressed.
     if ((!io->seek(io, 0)) || (br != sizeof (sig)))
-        return NULL;   // !!! FIXME: leaking MojoInput wrapper...
+    {
+        free_wrapper(io);
+        return NULL;
+    } // if
 
     if (!is_ustar(sig))
-        return NULL;   // !!! FIXME: leaking MojoInput wrapper...
-    
+    {
+        free_wrapper(io);
+        return NULL;
+    } // if
+
     // okay, it's a tarball, we're good to go.
 
     ar = (MojoArchive *) xmalloc(sizeof (MojoArchive));




More information about the mojosetup-commits mailing list