Fail silently if a partial tar header is read as tar.bz2 is leaving trailing junk...
authorGlenn L McGrath <bug1@ihug.co.nz>
Tue, 5 Nov 2002 02:56:57 +0000 (02:56 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Tue, 5 Nov 2002 02:56:57 +0000 (02:56 -0000)
archival/libunarchive/Makefile.in
archival/libunarchive/decompress_bunzip2.c
archival/libunarchive/filter_accept_list_reassign.c [new file with mode: 0644]
archival/libunarchive/get_header_tar.c
archival/libunarchive/get_header_tar_bz2.c [new file with mode: 0644]
archival/tar.c
include/unarchive.h

index 469004d5f28502e4ea1ed8c94c27c540d23d22f0..5675d092f46409106c9fa1b9d9092cd4725c2f06 100644 (file)
@@ -36,6 +36,7 @@ LIBUNARCHIVE-y:= \
 \
        get_header_ar.o \
        get_header_tar.o \
+       get_header_tar_bz2.o \
        get_header_tar_gz.o \
 \
        header_skip.o \
index 00ae5a494882254e4ae286d478b2526d836a89d4..4b611b833e1fabad24cea9459fcc77e252ae0497 100644 (file)
@@ -1274,7 +1274,7 @@ save_state_and_return:
        return retVal;   
 }
 
-static void BZ2_bzReadClose(void)
+extern void BZ2_bzReadClose(void)
 {
        if (bzf->initialisedOk) {
                bz_stream *strm = &(bzf->strm);
diff --git a/archival/libunarchive/filter_accept_list_reassign.c b/archival/libunarchive/filter_accept_list_reassign.c
new file mode 100644 (file)
index 0000000..fa294c7
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *  Copyright (C) 2002 by Glenn McGrath
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "libbb.h"
+#include "unarchive.h"
+
+/*
+ *     Reassign the subarchive metadata parser based on the filename extension
+ *  e.g. if its a .tar.gz modify archive_handle->sub_archive to process a .tar.gz
+ *       or if its a .tar.bz2 make archive_handle->sub_archive handle that 
+ */
+extern char filter_accept_list_reassign(archive_handle_t *archive_handle)
+{
+       /* Check the file entry is in the accept list */
+       if (find_list_entry(archive_handle->accept, archive_handle->file_header->name)) {
+               const char *name_ptr;
+
+               /* Extract the last 2 extensions */
+               name_ptr = strrchr(archive_handle->file_header->name, '.');
+
+               /* Modify the subarchive handler based on the extension */
+#ifdef CONFIG_FEATURE_DEB_TAR_GZ
+               if (strcmp(name_ptr, ".gz") == 0) {
+                       archive_handle->sub_archive->read = read;
+                       archive_handle->action_data_subarchive = get_header_tar_gz;
+                       return(EXIT_SUCCESS);
+               }
+#endif
+#ifdef CONFIG_FEATURE_DEB_TAR_BZ2
+               if (strcmp(name_ptr, ".bz2") == 0) {
+                       archive_handle->sub_archive->read = read_bz2;
+//                     BZ2_bzReadOpen(archive_handle->sub_archive->src_fd, NULL, 0);
+                       BZ2_bzReadOpen(archive_handle->src_fd, NULL, 0);
+                       archive_handle->action_data_subarchive = get_header_tar;
+                       return(EXIT_SUCCESS);
+               }
+#endif
+       }
+       return(EXIT_FAILURE);
+}
index 20451d99674882f1c05a9f701fb8e106294f656b..d3ff1608a25c1ecf82e4eb36a04033c5f1fb8e7a 100644 (file)
@@ -52,8 +52,8 @@ extern char get_header_tar(archive_handle_t *archive_handle)
        /* Align header */
        data_align(archive_handle, 512);
 
-       if (archive_xread_all_eof(archive_handle, tar.raw, 512) == 0) {
-               /* End of file */
+       if (archive_xread(archive_handle, tar.raw, 512) != 512) {
+               /* Assume end of file */
                return(EXIT_FAILURE);
        }
        archive_handle->offset += 512;
diff --git a/archival/libunarchive/get_header_tar_bz2.c b/archival/libunarchive/get_header_tar_bz2.c
new file mode 100644 (file)
index 0000000..4e47166
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "libbb.h"
+#include "unarchive.h"
+
+extern char get_header_tar_bz2(archive_handle_t *archive_handle)
+{
+       BZ2_bzReadOpen(archive_handle->src_fd, NULL, 0);
+
+       archive_handle->offset = 0;
+       while (get_header_tar(archive_handle) == EXIT_SUCCESS);
+
+       /* Cleanup */
+       BZ2_bzReadClose();
+       
+       /* Can only do one tar.bz2 per archive */
+       return(EXIT_FAILURE);
+}
+
index e1e121a09d9941f96542829e05e205afdd0faf05..95ef33b747ffa47b2dff0bfae068a231972ede97 100644 (file)
@@ -748,8 +748,7 @@ int tar_main(int argc, char **argv)
 #endif /* CONFIG_FEATURE_TAR_GZIP */
 #ifdef CONFIG_FEATURE_TAR_BZIP2
                if (tar_handle->read == read_bz2) {
-                       BZ2_bzReadOpen(tar_handle->src_fd, NULL, 0);
-                       while (get_header_tar(tar_handle) == EXIT_SUCCESS);
+                       get_header_tar_bz2(tar_handle);
                } else
 #endif /* CONFIG_FEATURE_TAR_BZIP2 */
 
index 18bf089fb99c61d4cdaddc3791ecc4d815a9867d..b4e8e6360537953d2fe8b5a48e8fa2147e5e5ac3 100644 (file)
@@ -91,6 +91,7 @@ extern void check_trailer_gzip(int src_fd);
 
 extern char get_header_ar(archive_handle_t *archive_handle);
 extern char get_header_tar(archive_handle_t *archive_handle);
+extern char get_header_tar_bz2(archive_handle_t *archive_handle);
 extern char get_header_tar_gz(archive_handle_t *archive_handle);
 
 extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount);
@@ -108,6 +109,7 @@ extern const llist_t *find_list_entry(const llist_t *list, const char *filename)
 
 extern ssize_t read_bz2(int fd, void *buf, size_t count);
 extern void BZ2_bzReadOpen(int fd, void *unused, int nUnused);
+extern void BZ2_bzReadClose(void);
 extern unsigned char uncompressStream(int src_fd, int dst_fd);
 
 #endif