Fix compress support and prevent a segfault
authorGlenn L McGrath <bug1@ihug.co.nz>
Fri, 27 Sep 2002 06:46:02 +0000 (06:46 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Fri, 27 Sep 2002 06:46:02 +0000 (06:46 -0000)
12 files changed:
archival/gunzip.c
archival/libunarchive/check_header_gzip.c
archival/libunarchive/data_extract_all.c
archival/libunarchive/decompress_uncompress.c
archival/libunarchive/filter_accept_all.c
archival/libunarchive/get_header_tar.c
archival/libunarchive/get_header_tar_gz.c
archival/libunarchive/uncompress.c
archival/rpm2cpio.c
include/libbb.h
include/unarchive.h
libbb/uncompress.c

index 4489204fb914376de6a69705ac4ef3f53da056c8..6ec5c69ae084a3f6e28501c92295d22173554cac 100644 (file)
@@ -163,11 +163,25 @@ extern int gunzip_main(int argc, char **argv)
                }
 
                /* do the decompression, and cleanup */
-               check_header_gzip(src_fd);
-               if (inflate(src_fd, dst_fd) != 0) {
-                       error_msg("Error inflating");
+               if (xread_char(src_fd) == 0x1f) {
+                       unsigned char magic2;
+                       
+                       magic2 = xread_char(src_fd);
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+                       if (magic2 == 0x9d) {
+                               return(uncompress(src_fd, dst_fd));
+                       } else 
+#endif
+                               if (magic2 == 0x8b) {
+                                       check_header_gzip(src_fd);
+                                       if (inflate(src_fd, dst_fd) != 0) {
+                                               error_msg("Error inflating");
+                                       }
+                                       check_trailer_gzip(src_fd);
+                               } else {
+                                       error_msg_and_die("Invalid magic\n");
+                               }
                }
-               check_trailer_gzip(src_fd);
 
                if ((status != EXIT_SUCCESS) && (new_path)) {
                        /* Unzip failed, remove new path instead of old path */
index 508d30924bc36fb0b0b470021c3a3f18aabd854f..e8bb8d5477a26680fd40e962c7a9e8686a7afdd0 100644 (file)
@@ -5,9 +5,8 @@
 extern void check_header_gzip(int src_fd)
 {
        union {
-               unsigned char raw[10];
+               unsigned char raw[8];
                struct {
-                       unsigned char magic[2];
                        unsigned char method;
                        unsigned char flags;
                        unsigned int mtime;
@@ -16,13 +15,7 @@ extern void check_header_gzip(int src_fd)
                } formated;
        } header;
 
-       xread_all(src_fd, header.raw, 10);
-
-   /* Magic header for gzip files, 1F 8B = \037\213 */
-       if ((header.formated.magic[0] != 0x1F)
-               || (header.formated.magic[1] != 0x8b)) {
-               error_msg_and_die("Invalid gzip magic");
-       }
+       xread_all(src_fd, header.raw, 8);
 
    /* Check the compression method */
        if (header.formated.method != 8) {
index 20d99aa58a9053f37f96c44f388d4e267898268a..a80f422b79470870850f050f04c2f21a4389344f 100644 (file)
@@ -18,7 +18,6 @@ extern void data_extract_all(archive_handle_t *archive_handle)
        if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) {
                char *dir = dirname(strdup(file_header->name));
                make_directory (dir, 0777, FILEUTILS_RECUR);
-               free(dir);
        }
 
        /* Create the file */
index 903e6aa6ddd031e9f2e7c3cd4c83b8080a6e946e..949e27df10fe533853c39580bcd1659f79719db7 100644 (file)
@@ -28,8 +28,9 @@
  * [... History snipped ...]
  *
  */
-#include       <stdio.h>
-
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
 
 #define        IBUFSIZ 2048    /* Defailt input buffer size                                                    */
 #define        OBUFSIZ 2048    /* Default output buffer size                                                   */
@@ -95,9 +96,6 @@ unsigned short        codetab[HSIZE];
 #define        clear_tab_prefixof()    memset(codetab, 0, 256);
 
 
-extern int uncompress ( FILE *, FILE * );
-
-
 /*
  * Decompress stdin to stdout.  This routine adapts to the codes in the
  * file building the "string" table on-the-fly; requiring no table to
@@ -105,7 +103,7 @@ extern int uncompress ( FILE *, FILE * );
  * with those of the compress() routine.  See the definitions above.
  */
 
-int uncompress ( FILE * fdin, FILE * fdout )
+extern int uncompress(int fd_in, int fd_out)
 {
     char_type          *stackp;
     code_int            code;
@@ -125,7 +123,7 @@ int uncompress ( FILE * fdin, FILE * fdout )
 
        insize = 0;
 
-       inbuf [0] = fgetc(fdin);
+       inbuf [0] = xread_char(fd_in);
 
        maxbits = inbuf[0] & BIT_MASK;
        block_mode = inbuf[0] & BLOCK_MODE;
@@ -173,11 +171,7 @@ resetbuf:  ;
 
                if (insize < (int) sizeof(inbuf)-IBUFSIZ)
                {
-                       rsize = fread(inbuf+insize, 1,IBUFSIZ,fdin);
-                       
-                       if ( !rsize && ferror(fdin))
-                               return -1;
-
+                       xread_all(fd_in, inbuf+insize, IBUFSIZ);
                        insize += rsize;
                }
 
@@ -275,8 +269,7 @@ resetbuf:   ;
 
                                                if (outpos >= OBUFSIZ)
                                                {
-                                                       fwrite(outbuf, 1,outpos,fdout);
-
+                                                       write(fd_out, outbuf, outpos);
                                                        outpos = 0;
                                                }
                                                stackp+= i;
@@ -303,8 +296,9 @@ resetbuf:   ;
     }
        while (rsize > 0);
 
-       if (outpos > 0)
-               fwrite(outbuf, outpos,1, fdout);
+       if (outpos > 0) {
+               write(fd_out, outbuf, outpos);
+       }
 
        return 0;
 }
index 0471ccef07adbfdff71ed7810a9a3cf7030c02c5..2838ea1f265ac110c355bacb4f17389939abbf66 100644 (file)
@@ -6,5 +6,9 @@
  */
 extern char filter_accept_all(const llist_t *accept_list, const llist_t *reject_list, const char *key)
 {
-       return(EXIT_SUCCESS);
+       if (key) {
+               return(EXIT_SUCCESS);
+       } else {
+               return(EXIT_FAILURE);
+       }
 }
index 2c8fc0aa02449d94159ae0d954ae8af22673d9f5..bb0affeb3c5677f1066a51397adede93a391e858 100644 (file)
@@ -155,7 +155,6 @@ extern char get_header_tar(archive_handle_t *archive_handle)
 # endif
        }
 #endif
-
        if (archive_handle->filter(archive_handle->accept, archive_handle->reject, archive_handle->file_header->name) == EXIT_SUCCESS) {
                archive_handle->action_header(archive_handle->file_header);
                archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
index c06beac9da748ca6979ee2fc5ecf799ce72222bc..24d19fbfdccd07b4dab2fd3740be46b091c5ca6a 100644 (file)
@@ -27,11 +27,17 @@ extern char get_header_tar_gz(archive_handle_t *archive_handle)
 {
        int fd_pipe[2];
        int pid;
+       unsigned char magic[2];
+       
+       xread_all(archive_handle->src_fd, &magic, 2);
+       if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
+               error_msg_and_die("Invalid gzip magic");
+       }
 
        check_header_gzip(archive_handle->src_fd);
 
        if (pipe(fd_pipe) != 0) {
-               error_msg_and_die("Can't create pipe\n");
+               error_msg_and_die("Can't create pipe");
        }
 
        pid = fork();
@@ -54,6 +60,7 @@ extern char get_header_tar_gz(archive_handle_t *archive_handle)
 
        archive_handle->src_fd = fd_pipe[0];
 
+       archive_handle->offset = 0;
        while (get_header_tar(archive_handle) == EXIT_SUCCESS);
 
        if (kill(pid, SIGTERM) == -1) {
index 903e6aa6ddd031e9f2e7c3cd4c83b8080a6e946e..949e27df10fe533853c39580bcd1659f79719db7 100644 (file)
@@ -28,8 +28,9 @@
  * [... History snipped ...]
  *
  */
-#include       <stdio.h>
-
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
 
 #define        IBUFSIZ 2048    /* Defailt input buffer size                                                    */
 #define        OBUFSIZ 2048    /* Default output buffer size                                                   */
@@ -95,9 +96,6 @@ unsigned short        codetab[HSIZE];
 #define        clear_tab_prefixof()    memset(codetab, 0, 256);
 
 
-extern int uncompress ( FILE *, FILE * );
-
-
 /*
  * Decompress stdin to stdout.  This routine adapts to the codes in the
  * file building the "string" table on-the-fly; requiring no table to
@@ -105,7 +103,7 @@ extern int uncompress ( FILE *, FILE * );
  * with those of the compress() routine.  See the definitions above.
  */
 
-int uncompress ( FILE * fdin, FILE * fdout )
+extern int uncompress(int fd_in, int fd_out)
 {
     char_type          *stackp;
     code_int            code;
@@ -125,7 +123,7 @@ int uncompress ( FILE * fdin, FILE * fdout )
 
        insize = 0;
 
-       inbuf [0] = fgetc(fdin);
+       inbuf [0] = xread_char(fd_in);
 
        maxbits = inbuf[0] & BIT_MASK;
        block_mode = inbuf[0] & BLOCK_MODE;
@@ -173,11 +171,7 @@ resetbuf:  ;
 
                if (insize < (int) sizeof(inbuf)-IBUFSIZ)
                {
-                       rsize = fread(inbuf+insize, 1,IBUFSIZ,fdin);
-                       
-                       if ( !rsize && ferror(fdin))
-                               return -1;
-
+                       xread_all(fd_in, inbuf+insize, IBUFSIZ);
                        insize += rsize;
                }
 
@@ -275,8 +269,7 @@ resetbuf:   ;
 
                                                if (outpos >= OBUFSIZ)
                                                {
-                                                       fwrite(outbuf, 1,outpos,fdout);
-
+                                                       write(fd_out, outbuf, outpos);
                                                        outpos = 0;
                                                }
                                                stackp+= i;
@@ -303,8 +296,9 @@ resetbuf:   ;
     }
        while (rsize > 0);
 
-       if (outpos > 0)
-               fwrite(outbuf, outpos,1, fdout);
+       if (outpos > 0) {
+               write(fd_out, outbuf, outpos);
+       }
 
        return 0;
 }
index e1e93988f66e29c78786b6be00c0de6b94314c34..9372dc5e17057f610bbd0efd44ea72caaf84ee7d 100644 (file)
@@ -70,6 +70,7 @@ extern int rpm2cpio_main(int argc, char **argv)
 {
        struct rpm_lead lead;
        int rpm_fd;
+       unsigned char magic[2];
 
        if (argc == 1) {
                rpm_fd = fileno(stdin);
@@ -88,6 +89,11 @@ extern int rpm2cpio_main(int argc, char **argv)
 
        /* Skip the main header */
        skip_header(rpm_fd);
+       
+       xread_all(rpm_fd, &magic, 2);
+       if ((magic[0] != 0x1f) || (magic[1] != 0x8b))
+               error_msg_and_die("Invalid gzip magic");
+       }
 
        check_header_gzip(rpm_fd);
        if (inflate(rpm_fd, fileno(stdout)) != 0) {
index 9dbbb47ce16e2495b1b8bd9d2315842ef6cede7c..2fec93db1002c2792e0d70326a4d88214891ba97 100644 (file)
@@ -226,6 +226,7 @@ extern long arith (const char *startbuf, int *errcode);
 int read_package_field(const char *package_buffer, char **field_name, char **field_value);
 char *fgets_str(FILE *file, const char *terminating_string);
 
+extern int uncompress(int fd_in, int fd_out);
 extern int inflate(int in, int out);
 
 extern struct hostent *xgethostbyname(const char *name);
index e564e9572ef6d0dc0b504511de45a7663b57d44b..023c3e8aabb8274aa6f032adaa69c3238dfbc8de 100644 (file)
@@ -85,7 +85,7 @@ 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_gz(archive_handle_t *archive_handle);
 
-//extern void seek_sub_file(int src_fd, unsigned int amount);
+extern void seek_sub_file(int src_fd, unsigned int amount);
 extern const unsigned short data_align(const int src_fd, const unsigned int offset, const unsigned short align_to);
 extern const llist_t *add_to_list(const llist_t *old_head, const char *new_item);
 extern int copy_file_chunk_fd(int src_fd, int dst_fd, unsigned long long chunksize);
index 903e6aa6ddd031e9f2e7c3cd4c83b8080a6e946e..949e27df10fe533853c39580bcd1659f79719db7 100644 (file)
@@ -28,8 +28,9 @@
  * [... History snipped ...]
  *
  */
-#include       <stdio.h>
-
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
 
 #define        IBUFSIZ 2048    /* Defailt input buffer size                                                    */
 #define        OBUFSIZ 2048    /* Default output buffer size                                                   */
@@ -95,9 +96,6 @@ unsigned short        codetab[HSIZE];
 #define        clear_tab_prefixof()    memset(codetab, 0, 256);
 
 
-extern int uncompress ( FILE *, FILE * );
-
-
 /*
  * Decompress stdin to stdout.  This routine adapts to the codes in the
  * file building the "string" table on-the-fly; requiring no table to
@@ -105,7 +103,7 @@ extern int uncompress ( FILE *, FILE * );
  * with those of the compress() routine.  See the definitions above.
  */
 
-int uncompress ( FILE * fdin, FILE * fdout )
+extern int uncompress(int fd_in, int fd_out)
 {
     char_type          *stackp;
     code_int            code;
@@ -125,7 +123,7 @@ int uncompress ( FILE * fdin, FILE * fdout )
 
        insize = 0;
 
-       inbuf [0] = fgetc(fdin);
+       inbuf [0] = xread_char(fd_in);
 
        maxbits = inbuf[0] & BIT_MASK;
        block_mode = inbuf[0] & BLOCK_MODE;
@@ -173,11 +171,7 @@ resetbuf:  ;
 
                if (insize < (int) sizeof(inbuf)-IBUFSIZ)
                {
-                       rsize = fread(inbuf+insize, 1,IBUFSIZ,fdin);
-                       
-                       if ( !rsize && ferror(fdin))
-                               return -1;
-
+                       xread_all(fd_in, inbuf+insize, IBUFSIZ);
                        insize += rsize;
                }
 
@@ -275,8 +269,7 @@ resetbuf:   ;
 
                                                if (outpos >= OBUFSIZ)
                                                {
-                                                       fwrite(outbuf, 1,outpos,fdout);
-
+                                                       write(fd_out, outbuf, outpos);
                                                        outpos = 0;
                                                }
                                                stackp+= i;
@@ -303,8 +296,9 @@ resetbuf:   ;
     }
        while (rsize > 0);
 
-       if (outpos > 0)
-               fwrite(outbuf, outpos,1, fdout);
+       if (outpos > 0) {
+               write(fd_out, outbuf, outpos);
+       }
 
        return 0;
 }