tar: revert older fix (non-portable), added new one. testsuite tar-extracts-all-subdirs now passes.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -14,14 +14,14 @@ | |
| char filter_accept_reject_list(archive_handle_t *archive_handle) | |
| { | |
| const char *key = archive_handle->file_header->name; | |
| - | const llist_t *reject_entry = find_list_entry(archive_handle->reject, key); |
| + | const llist_t *reject_entry = find_list_entry2(archive_handle->reject, key); |
| const llist_t *accept_entry; | |
| /* If the key is in a reject list fail */ | |
| if (reject_entry) { | |
| return(EXIT_FAILURE); | |
| } | |
| - | accept_entry = find_list_entry(archive_handle->accept, key); |
| + | accept_entry = find_list_entry2(archive_handle->accept, key); |
| /* Fail if an accept list was specified and the key wasnt in there */ | |
| if ((accept_entry == NULL) && archive_handle->accept) { | |
| @@ -9,14 +9,46 @@ | |
| #include <stdlib.h> | |
| #include "unarchive.h" | |
| - | /* Find a string in a list */ |
| + | /* Find a string in a shell pattern list */ |
| const llist_t *find_list_entry(const llist_t *list, const char *filename) | |
| { | |
| while (list) { | |
| - | if (fnmatch(list->data, filename, FNM_LEADING_DIR) == 0) { |
| - | return (list); |
| + | if (fnmatch(list->data, filename, 0) == 0) { |
| + | return list; |
| } | |
| list = list->link; | |
| } | |
| - | return(NULL); |
| + | return NULL; |
| + | } |
| + | |
| + | /* Same, but compares only path components present in pattern |
| + | * (extra trailing path components in filename are assumed to match) |
| + | */ |
| + | const llist_t *find_list_entry2(const llist_t *list, const char *filename) |
| + | { |
| + | char buf[PATH_MAX]; |
| + | int pattern_slash_cnt; |
| + | const char *c; |
| + | char *d; |
| + | |
| + | while (list) { |
| + | c = list->data; |
| + | pattern_slash_cnt = 0; |
| + | while (*c) |
| + | if (*c++ == '/') pattern_slash_cnt++; |
| + | c = filename; |
| + | d = buf; |
| + | /* paranoia is better that buffer overflows */ |
| + | while (*c && d != buf + sizeof(buf)-1) { |
| + | if (*c == '/' && --pattern_slash_cnt < 0) |
| + | break; |
| + | *d++ = *c++; |
| + | } |
| + | *d = '\0'; |
| + | if (fnmatch(list->data, buf, 0) == 0) { |
| + | return list; |
| + | } |
| + | list = list->link; |
| + | } |
| + | return NULL; |
| } | |
| @@ -545,8 +545,12 @@ static llist_t *append_file_list_to_list(llist_t *list) | |
| tmp = cur; | |
| cur = cur->link; | |
| free(tmp); | |
| - | while ((line = bb_get_chomped_line_from_file(src_stream)) != NULL) |
| + | while ((line = bb_get_chomped_line_from_file(src_stream)) != NULL) { |
| + | char *filename_ptr = last_char_is(line, '/'); |
| + | if (filename_ptr > line) |
| + | *filename_ptr = '\0'; |
| llist_add_to(&newlist, line); | |
| + | } |
| fclose(src_stream); | |
| } | |
| return newlist; | |
| @@ -98,6 +98,7 @@ extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned | |
| extern void data_align(archive_handle_t *archive_handle, const unsigned short boundary); | |
| extern const llist_t *find_list_entry(const llist_t *list, const char *filename); | |
| + | extern const llist_t *find_list_entry2(const llist_t *list, const char *filename); |
| extern int uncompressStream(int src_fd, int dst_fd); | |
| extern void inflate_init(unsigned int bufsize); | |