diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-06-22 16:27:21 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-06-22 16:27:21 +0200 |
commit | 440a509849391f2dc8ec720a136577ede3306fa8 (patch) | |
tree | d52caed6f400212530c8a2b1eab6c4829a530aac | |
parent | d52c9510fd3a9407044166360fe8b752fd841efc (diff) | |
download | busybox-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.c | 13 | ||||
-rw-r--r-- | archival/libarchive/get_header_tar.c | 6 | ||||
-rw-r--r-- | include/bb_archive.h | 1 |
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 */ |