diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2014-02-02 02:06:38 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2014-02-02 02:06:38 +0100 |
commit | 640ce3de07807133796bccd0bdfa146bbfc788c7 (patch) | |
tree | 0d17e53405b8cbf71aed4d8ba6c9dc27df14814a | |
parent | f1999b5a9d2788cdc120b1ee2ab1de18e95b38f2 (diff) | |
download | busybox-640ce3de07807133796bccd0bdfa146bbfc788c7.tar.gz |
zcat: complain if input is not compressed
function old new delta
buffer_fill_and_print 178 191 +13
varvalue 735 743 +8
bbunpack 747 755 +8
open_zipped 85 89 +4
xmalloc_open_zipped_read_close 61 63 +2
get_addr_1 240 242 +2
fbsplash_main 1228 1230 +2
pstree_main 322 321 -1
builtin_type 121 119 -2
do_load 954 926 -28
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 7/3 up/down: 39/-31) Total: 8 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/bbunzip.c | 5 | ||||
-rw-r--r-- | archival/libarchive/get_header_tar.c | 2 | ||||
-rw-r--r-- | archival/libarchive/open_transformer.c | 19 | ||||
-rw-r--r-- | archival/rpm.c | 2 | ||||
-rw-r--r-- | archival/rpm2cpio.c | 2 | ||||
-rw-r--r-- | archival/tar.c | 2 | ||||
-rw-r--r-- | include/libbb.h | 6 | ||||
-rw-r--r-- | miscutils/fbsplash.c | 2 | ||||
-rw-r--r-- | miscutils/man.c | 2 |
9 files changed, 17 insertions, 25 deletions
diff --git a/archival/bbunzip.c b/archival/bbunzip.c index b3fb90f31..fce5ab9e1 100644 --- a/archival/bbunzip.c +++ b/archival/bbunzip.c @@ -72,7 +72,8 @@ int FAST_FUNC bbunpack(char **argv, goto err; } else { /* "clever zcat" with FILE */ - int fd = open_zipped(filename); + /* fail_if_not_compressed because zcat refuses uncompressed input */ + int fd = open_zipped(filename, /*fail_if_not_compressed:*/ 1); if (fd < 0) goto err_name; xmove_fd(fd, STDIN_FILENO); @@ -80,7 +81,7 @@ int FAST_FUNC bbunpack(char **argv, } else if (option_mask32 & SEAMLESS_MAGIC) { /* "clever zcat" on stdin */ - if (setup_unzip_on_fd(STDIN_FILENO, /*fail_if_not_detected*/ 0)) + if (setup_unzip_on_fd(STDIN_FILENO, /*fail_if_not_compressed*/ 1)) goto err; } diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c index 54d910431..ba43bb073 100644 --- a/archival/libarchive/get_header_tar.c +++ b/archival/libarchive/get_header_tar.c @@ -243,7 +243,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) * or not first block (false positive, it's not .gz/.bz2!) */ if (lseek(archive_handle->src_fd, -i, SEEK_CUR) != 0) goto err; - if (setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_detected:*/ 0) != 0) + if (setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_compressed:*/ 0) != 0) err: bb_error_msg_and_die("invalid tar magic"); archive_handle->offset = 0; diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c index 27854af21..198663041 100644 --- a/archival/libarchive/open_transformer.c +++ b/archival/libarchive/open_transformer.c @@ -118,7 +118,7 @@ void FAST_FUNC open_transformer(int fd, const char *transform_prog) /* Used by e.g. rpm which gives us a fd without filename, * thus we can't guess the format from filename's extension. */ -int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_detected) +int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_compressed) { union { uint8_t b[4]; @@ -159,7 +159,7 @@ int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_detected) } /* No known magic seen */ - if (fail_if_not_detected) + if (fail_if_not_compressed) bb_error_msg_and_die("no gzip" IF_FEATURE_SEAMLESS_BZ2("/bzip2") IF_FEATURE_SEAMLESS_XZ("/xz") @@ -180,7 +180,7 @@ int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_detected) return 0; } -int FAST_FUNC open_zipped(const char *fname) +int FAST_FUNC open_zipped(const char *fname, int fail_if_not_compressed) { int fd; @@ -200,16 +200,7 @@ int FAST_FUNC open_zipped(const char *fname) || (ENABLE_FEATURE_SEAMLESS_BZ2) || (ENABLE_FEATURE_SEAMLESS_XZ) ) { - /* - * Do we want to fail_if_not_detected? - * In most cases, no: think "insmod non_compressed_module". - * A case which would like to fail is "zcat uncompressed_file": - * otherwise, it happily outputs uncompressed_file as-is, - * which is, strictly speaking, not what is expected. - * If this ever becomes a problem, we can add - * fail_if_not_detected bool argument to open_zipped(). - */ - setup_unzip_on_fd(fd, /*fail_if_not_detected:*/ 0); + setup_unzip_on_fd(fd, fail_if_not_compressed); } return fd; @@ -222,7 +213,7 @@ void* FAST_FUNC xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_ int fd; char *image; - fd = open_zipped(fname); + fd = open_zipped(fname, /*fail_if_not_compressed:*/ 0); if (fd < 0) return NULL; diff --git a/archival/rpm.c b/archival/rpm.c index 885eddd64..105394481 100644 --- a/archival/rpm.c +++ b/archival/rpm.c @@ -122,7 +122,7 @@ static void extract_cpio(int fd, const char *source_rpm) archive_handle->src_fd = fd; /*archive_handle->offset = 0; - init_handle() did it */ - setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_detected:*/ 1); + setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_compressed:*/ 1); while (get_header_cpio(archive_handle) == EXIT_SUCCESS) continue; } diff --git a/archival/rpm2cpio.c b/archival/rpm2cpio.c index 61adde795..7057570f5 100644 --- a/archival/rpm2cpio.c +++ b/archival/rpm2cpio.c @@ -80,7 +80,7 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv) // signal(SIGCHLD, check_errors_in_children); /* This works, but doesn't report uncompress errors (they happen in child) */ - setup_unzip_on_fd(rpm_fd, /*fail_if_not_detected:*/ 1); + setup_unzip_on_fd(rpm_fd, /*fail_if_not_compressed:*/ 1); if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0) bb_error_msg_and_die("error unpacking"); diff --git a/archival/tar.c b/archival/tar.c index bd61abd57..aa02d3512 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -1137,7 +1137,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv) && flags == O_RDONLY && !(opt & OPT_ANY_COMPRESS) ) { - tar_handle->src_fd = open_zipped(tar_filename); + tar_handle->src_fd = open_zipped(tar_filename, /*fail_if_not_compressed:*/ 0); if (tar_handle->src_fd < 0) bb_perror_msg_and_die("can't open '%s'", tar_filename); } else { diff --git a/include/libbb.h b/include/libbb.h index 64167bba3..96f33340e 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -736,12 +736,12 @@ extern void *xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p) FAS #if SEAMLESS_COMPRESSION /* Autodetects gzip/bzip2 formats. fd may be in the middle of the file! */ -extern int setup_unzip_on_fd(int fd, int fail_if_not_detected) FAST_FUNC; +extern int setup_unzip_on_fd(int fd, int fail_if_not_compressed) FAST_FUNC; /* Autodetects .gz etc */ -extern int open_zipped(const char *fname) FAST_FUNC; +extern int open_zipped(const char *fname, int fail_if_not_compressed) FAST_FUNC; #else # define setup_unzip_on_fd(...) (0) -# define open_zipped(fname) open((fname), O_RDONLY); +# define open_zipped(fname, fail_if_not_compressed) open((fname), O_RDONLY); #endif extern void *xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c index 12a77b70f..7b695b26f 100644 --- a/miscutils/fbsplash.c +++ b/miscutils/fbsplash.c @@ -353,7 +353,7 @@ static void fb_drawimage(void) if (LONE_DASH(G.image_filename)) { theme_file = stdin; } else { - int fd = open_zipped(G.image_filename); + int fd = open_zipped(G.image_filename, /*fail_if_not_compressed:*/ 0); if (fd < 0) bb_simple_perror_msg_and_die(G.image_filename); theme_file = xfdopen_for_read(fd); diff --git a/miscutils/man.c b/miscutils/man.c index 51baceb16..f046e24f3 100644 --- a/miscutils/man.c +++ b/miscutils/man.c @@ -102,7 +102,7 @@ static int run_pipe(const char *pager, char *man_filename, int man, int level) ordinary_manpage: close(STDIN_FILENO); - open_zipped(man_filename); /* guaranteed to use fd 0 (STDIN_FILENO) */ + open_zipped(man_filename, /*fail_if_not_compressed:*/ 0); /* guaranteed to use fd 0 (STDIN_FILENO) */ /* "2>&1" is added so that nroff errors are shown in pager too. * Otherwise it may show just empty screen */ cmd = xasprintf( |