X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libbb%2Funarchive.c;h=bd10ad92d6cdd42d2bb42c711af8680805aa5280;hp=782efd0a4a2065ab3ec780287b452d773977c4bb;hb=3f4b79e8ce98192e59d6488e2e8f9fe178487571;hpb=53a42ce9e6cd906013c8d478751f496f2b367e5f diff --git a/libbb/unarchive.c b/libbb/unarchive.c index 782efd0..bd10ad9 100644 --- a/libbb/unarchive.c +++ b/libbb/unarchive.c @@ -141,7 +141,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f fread(buffer, 1, file_entry->size, src_stream); buffer[file_entry->size] = '\0'; archive_offset += file_entry->size; - return(buffer); + goto cleanup; } } else if (function & extract_all_to_fs) { @@ -158,7 +158,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f error_msg("%s not created: newer or same age file exists", file_entry->name); } seek_sub_file(src_stream, file_entry->size); - return (NULL); + goto cleanup; } } if (function & extract_create_leading_dirs) { /* Create leading directories with default umask */ @@ -184,7 +184,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f } else { if ((dst_stream = wfopen(full_name, "w")) == NULL) { seek_sub_file(src_stream, file_entry->size); - return NULL; + goto cleanup; } archive_offset += file_entry->size; copy_file_chunk(src_stream, dst_stream, file_entry->size); @@ -205,7 +205,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f if ((function & extract_quiet) != extract_quiet) { perror_msg("Cannot create symlink from %s to '%s'", file_entry->name, file_entry->link_name); } - return NULL; + goto cleanup; } break; case S_IFSOCK: @@ -216,7 +216,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f if ((function & extract_quiet) != extract_quiet) { perror_msg("Cannot create node %s", file_entry->name); } - return NULL; + goto cleanup; } break; default: @@ -259,11 +259,12 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f fprintf(out_stream, "%s\n", file_entry->name); } +cleanup: free(full_name); if ( full_link_name ) free(full_link_name); - return(NULL); /* Maybe we should say if failed */ + return(buffer); /* Maybe we should say if failed */ } #endif @@ -728,7 +729,7 @@ void free_header_tar(file_header_t *tar_entry) char *deb_extract(const char *package_filename, FILE *out_stream, const int extract_function, const char *prefix, const char *filename) { - FILE *deb_stream; + FILE *deb_stream = NULL; FILE *uncompressed_stream = NULL; file_header_t *ar_header = NULL; char **file_list = NULL; @@ -739,24 +740,24 @@ char *deb_extract(const char *package_filename, FILE *out_stream, if (filename != NULL) { file_list = xmalloc(sizeof(char *) * 2); - file_list[0] = xstrdup(filename); + file_list[0] = filename; file_list[1] = NULL; } if (extract_function & extract_control_tar_gz) { - ared_file = xstrdup("control.tar.gz"); + ared_file = "control.tar.gz"; } else if (extract_function & extract_data_tar_gz) { - ared_file = xstrdup("data.tar.gz"); + ared_file = "data.tar.gz"; } else { fprintf(stderr, "no file specified to extract -- extract_function=%x\n", extract_function); - return NULL; + goto cleanup; } /* open the debian package to be worked on */ deb_stream = wfopen(package_filename, "r"); if (deb_stream == NULL) { - return(NULL); + goto cleanup; } /* set the buffer size */ setvbuf(deb_stream, NULL, _IOFBF, 0x8000); @@ -772,7 +773,7 @@ char *deb_extract(const char *package_filename, FILE *out_stream, /* open a stream of decompressed data */ uncompressed_stream = gz_open(deb_stream, &gunzip_pid); if (uncompressed_stream == NULL) { - return(NULL); + goto cleanup; } archive_offset = 0; @@ -783,10 +784,8 @@ char *deb_extract(const char *package_filename, FILE *out_stream, free (ar_header); } gz_close(gunzip_pid); - fclose(deb_stream); fclose(uncompressed_stream); - free(ared_file); - return(output_buffer); + goto cleanup; } else if (strncmp(ar_magic, "\037\213", 2) == 0) { /* it's a gz file, let's assume it's an opkg */ int unzipped_opkg_pid; @@ -796,7 +795,7 @@ char *deb_extract(const char *package_filename, FILE *out_stream, fseek(deb_stream, 0, SEEK_SET); unzipped_opkg_stream = gz_open(deb_stream, &unzipped_opkg_pid); if (unzipped_opkg_stream == NULL) { - return(NULL); + goto cleanup; } /*fprintf(stderr, __FUNCTION__ ": processing opkg %s -- ared_file=%s\n", package_filename, ared_file);*/ @@ -809,7 +808,7 @@ char *deb_extract(const char *package_filename, FILE *out_stream, /* open a stream of decompressed data */ uncompressed_stream = gz_open(unzipped_opkg_stream, &gunzip_pid); if (uncompressed_stream == NULL) { - return(NULL); + goto cleanup; } archive_offset = 0; /*fprintf(stderr, __FUNCTION__ ":%d: here -- found file\n", __LINE__);*/ @@ -831,13 +830,18 @@ char *deb_extract(const char *package_filename, FILE *out_stream, } gz_close(unzipped_opkg_pid); fclose(unzipped_opkg_stream); - fclose(deb_stream); - free(ared_file); /*fprintf(stderr, __FUNCTION__ ":%d: done\n", __LINE__);*/ - return output_buffer; + goto cleanup; } else { error_msg_and_die("invalid magic"); } +cleanup: + if (deb_stream) + fclose(deb_stream); + if (file_list) + free(file_list); + + return output_buffer; } #endif