aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-06-22 16:27:21 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-06-22 16:27:21 +0200
commit440a509849391f2dc8ec720a136577ede3306fa8 (patch)
treed52caed6f400212530c8a2b1eab6c4829a530aac
parentd52c9510fd3a9407044166360fe8b752fd841efc (diff)
downloadbusybox-w32-440a509849391f2dc8ec720a136577ede3306fa8.tar.gz
busybox-w32-440a509849391f2dc8ec720a136577ede3306fa8.tar.bz2
busybox-w32-440a509849391f2dc8ec720a136577ede3306fa8.zip
dpkg: fix creation of .list files (were empty since b768aeb). Closes 5324
While at it, fix filename order and free the list of names. function old new delta llist_rev - 21 +21 get_header_tar 1733 1741 +8 unpack_package 587 585 -2 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/1 up/down: 29/-2) Total: 27 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/dpkg.c13
-rw-r--r--archival/libarchive/get_header_tar.c6
-rw-r--r--include/bb_archive.h1
3 files changed, 14 insertions, 6 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c
index bf9e9992c..dae8a9747 100644
--- a/archival/dpkg.c
+++ b/archival/dpkg.c
@@ -1665,20 +1665,25 @@ static void unpack_package(deb_file_t *deb_file)
1665 archive_handle = init_archive_deb_ar(deb_file->filename); 1665 archive_handle = init_archive_deb_ar(deb_file->filename);
1666 init_archive_deb_data(archive_handle); 1666 init_archive_deb_data(archive_handle);
1667 archive_handle->dpkg__sub_archive->accept = conffile_list; 1667 archive_handle->dpkg__sub_archive->accept = conffile_list;
1668 /* Why ARCHIVE_REMEMBER_NAMES?
1669 * We want names collected in ->passed list even if conffile_list
1670 * is NULL (otherwise get_header_tar may optimize name saving out):
1671 */
1672 archive_handle->dpkg__sub_archive->ah_flags |= ARCHIVE_REMEMBER_NAMES | ARCHIVE_UNLINK_OLD;
1668 archive_handle->dpkg__sub_archive->filter = filter_rename_config; 1673 archive_handle->dpkg__sub_archive->filter = filter_rename_config;
1669 archive_handle->dpkg__sub_archive->action_data = data_extract_all_prefix; 1674 archive_handle->dpkg__sub_archive->action_data = data_extract_all_prefix;
1670 archive_handle->dpkg__sub_archive->dpkg__buffer = (char*)"/"; /* huh? */ 1675 archive_handle->dpkg__sub_archive->dpkg__buffer = (char*)"/"; /* huh? */
1671 archive_handle->dpkg__sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
1672 unpack_ar_archive(archive_handle); 1676 unpack_ar_archive(archive_handle);
1673 1677
1674 /* Create the list file */ 1678 /* Create the list file */
1675 list_filename = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "list"); 1679 list_filename = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "list");
1676 out_stream = xfopen_for_write(list_filename); 1680 out_stream = xfopen_for_write(list_filename);
1681 archive_handle->dpkg__sub_archive->passed = llist_rev(archive_handle->dpkg__sub_archive->passed);
1677 while (archive_handle->dpkg__sub_archive->passed) { 1682 while (archive_handle->dpkg__sub_archive->passed) {
1683 char *filename = llist_pop(&archive_handle->dpkg__sub_archive->passed);
1678 /* the leading . has been stripped by data_extract_all_prefix already */ 1684 /* the leading . has been stripped by data_extract_all_prefix already */
1679 fputs(archive_handle->dpkg__sub_archive->passed->data, out_stream); 1685 fprintf(out_stream, "%s\n", filename);
1680 fputc('\n', out_stream); 1686 free(filename);
1681 archive_handle->dpkg__sub_archive->passed = archive_handle->dpkg__sub_archive->passed->link;
1682 } 1687 }
1683 fclose(out_stream); 1688 fclose(out_stream);
1684 1689
diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c
index b168653d8..bc09756ba 100644
--- a/archival/libarchive/get_header_tar.c
+++ b/archival/libarchive/get_header_tar.c
@@ -452,9 +452,11 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
452 if (cp) 452 if (cp)
453 *cp = '\0'; 453 *cp = '\0';
454 archive_handle->action_data(archive_handle); 454 archive_handle->action_data(archive_handle);
455 if (archive_handle->accept || archive_handle->reject) 455 if (archive_handle->accept || archive_handle->reject
456 || (archive_handle->ah_flags & ARCHIVE_REMEMBER_NAMES)
457 ) {
456 llist_add_to(&archive_handle->passed, file_header->name); 458 llist_add_to(&archive_handle->passed, file_header->name);
457 else /* Caller isn't interested in list of unpacked files */ 459 } else /* Caller isn't interested in list of unpacked files */
458 free(file_header->name); 460 free(file_header->name);
459 } else { 461 } else {
460 data_skip(archive_handle); 462 data_skip(archive_handle);
diff --git a/include/bb_archive.h b/include/bb_archive.h
index 2043d8570..7bb5615da 100644
--- a/include/bb_archive.h
+++ b/include/bb_archive.h
@@ -121,6 +121,7 @@ typedef struct archive_handle_t {
121#define ARCHIVE_DONT_RESTORE_PERM (1 << 6) 121#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
122#define ARCHIVE_NUMERIC_OWNER (1 << 7) 122#define ARCHIVE_NUMERIC_OWNER (1 << 7)
123#define ARCHIVE_O_TRUNC (1 << 8) 123#define ARCHIVE_O_TRUNC (1 << 8)
124#define ARCHIVE_REMEMBER_NAMES (1 << 9)
124 125
125 126
126/* POSIX tar Header Block, from POSIX 1003.1-1990 */ 127/* POSIX tar Header Block, from POSIX 1003.1-1990 */