--- trunk/mkinitrd-magellan/busybox/archival/libunarchive/get_header_ar.c 2009/04/24 18:32:46 815 +++ trunk/mkinitrd-magellan/busybox/archival/libunarchive/get_header_ar.c 2009/04/24 18:33:46 816 @@ -7,7 +7,7 @@ #include "libbb.h" #include "unarchive.h" -char get_header_ar(archive_handle_t *archive_handle) +char FAST_FUNC get_header_ar(archive_handle_t *archive_handle) { int err; file_header_t *typed = archive_handle->file_header; @@ -23,9 +23,9 @@ char magic[2]; } formatted; } ar; -#ifdef CONFIG_FEATURE_AR_LONG_FILENAMES +#if ENABLE_FEATURE_AR_LONG_FILENAMES static char *ar_long_names; - static unsigned int ar_long_name_size; + static unsigned ar_long_name_size; #endif /* dont use xread as we want to handle the error ourself */ @@ -66,7 +66,9 @@ /* long filenames have '/' as the first character */ if (ar.formatted.name[0] == '/') { -#ifdef CONFIG_FEATURE_AR_LONG_FILENAMES +#if ENABLE_FEATURE_AR_LONG_FILENAMES + unsigned long_offset; + if (ar.formatted.name[1] == '/') { /* If the second char is a '/' then this entries data section * stores long filename for multiple entries, they are stored @@ -78,20 +80,22 @@ /* This ar entries data section only contained filenames for other records * they are stored in the static ar_long_names for future reference */ return get_header_ar(archive_handle); /* Return next header */ - } else if (ar.formatted.name[1] == ' ') { + } + + if (ar.formatted.name[1] == ' ') { /* This is the index of symbols in the file for compilers */ data_skip(archive_handle); archive_handle->offset += typed->size; return get_header_ar(archive_handle); /* Return next header */ - } else { - /* The number after the '/' indicates the offset in the ar data section - (saved in variable long_name) that conatains the real filename */ - const unsigned int long_offset = atoi(&ar.formatted.name[1]); - if (long_offset >= ar_long_name_size) { - bb_error_msg_and_die("can't resolve long filename"); - } - typed->name = xstrdup(ar_long_names + long_offset); } + + /* The number after the '/' indicates the offset in the ar data section + * (saved in variable long_name) that conatains the real filename */ + long_offset = atoi(&ar.formatted.name[1]); + if (long_offset >= ar_long_name_size) { + bb_error_msg_and_die("can't resolve long filename"); + } + typed->name = xstrdup(ar_long_names + long_offset); #else bb_error_msg_and_die("long filenames not supported"); #endif @@ -104,12 +108,13 @@ if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { archive_handle->action_header(typed); +#if ENABLE_DPKG || ENABLE_DPKG_DEB if (archive_handle->sub_archive) { while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS) - /* repeat */; - } else { + continue; + } else +#endif archive_handle->action_data(archive_handle); - } } else { data_skip(archive_handle); }