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>
This commit is contained in:
Denys Vlasenko 2014-02-02 02:06:38 +01:00
parent f1999b5a9d
commit 640ce3de07
9 changed files with 17 additions and 25 deletions

View File

@ -72,7 +72,8 @@ int FAST_FUNC bbunpack(char **argv,
goto err; goto err;
} else { } else {
/* "clever zcat" with FILE */ /* "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) if (fd < 0)
goto err_name; goto err_name;
xmove_fd(fd, STDIN_FILENO); xmove_fd(fd, STDIN_FILENO);
@ -80,7 +81,7 @@ int FAST_FUNC bbunpack(char **argv,
} else } else
if (option_mask32 & SEAMLESS_MAGIC) { if (option_mask32 & SEAMLESS_MAGIC) {
/* "clever zcat" on stdin */ /* "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; goto err;
} }

View File

@ -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!) */ * or not first block (false positive, it's not .gz/.bz2!) */
if (lseek(archive_handle->src_fd, -i, SEEK_CUR) != 0) if (lseek(archive_handle->src_fd, -i, SEEK_CUR) != 0)
goto err; 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: err:
bb_error_msg_and_die("invalid tar magic"); bb_error_msg_and_die("invalid tar magic");
archive_handle->offset = 0; archive_handle->offset = 0;

View File

@ -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, /* Used by e.g. rpm which gives us a fd without filename,
* thus we can't guess the format from filename's extension. * 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 { union {
uint8_t b[4]; 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 */ /* No known magic seen */
if (fail_if_not_detected) if (fail_if_not_compressed)
bb_error_msg_and_die("no gzip" bb_error_msg_and_die("no gzip"
IF_FEATURE_SEAMLESS_BZ2("/bzip2") IF_FEATURE_SEAMLESS_BZ2("/bzip2")
IF_FEATURE_SEAMLESS_XZ("/xz") 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; 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; int fd;
@ -200,16 +200,7 @@ int FAST_FUNC open_zipped(const char *fname)
|| (ENABLE_FEATURE_SEAMLESS_BZ2) || (ENABLE_FEATURE_SEAMLESS_BZ2)
|| (ENABLE_FEATURE_SEAMLESS_XZ) || (ENABLE_FEATURE_SEAMLESS_XZ)
) { ) {
/* setup_unzip_on_fd(fd, fail_if_not_compressed);
* 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);
} }
return fd; return fd;
@ -222,7 +213,7 @@ void* FAST_FUNC xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_
int fd; int fd;
char *image; char *image;
fd = open_zipped(fname); fd = open_zipped(fname, /*fail_if_not_compressed:*/ 0);
if (fd < 0) if (fd < 0)
return NULL; return NULL;

View File

@ -122,7 +122,7 @@ static void extract_cpio(int fd, const char *source_rpm)
archive_handle->src_fd = fd; archive_handle->src_fd = fd;
/*archive_handle->offset = 0; - init_handle() did it */ /*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) while (get_header_cpio(archive_handle) == EXIT_SUCCESS)
continue; continue;
} }

View File

@ -80,7 +80,7 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv)
// signal(SIGCHLD, check_errors_in_children); // signal(SIGCHLD, check_errors_in_children);
/* This works, but doesn't report uncompress errors (they happen in child) */ /* 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) if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0)
bb_error_msg_and_die("error unpacking"); bb_error_msg_and_die("error unpacking");

View File

@ -1137,7 +1137,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
&& flags == O_RDONLY && flags == O_RDONLY
&& !(opt & OPT_ANY_COMPRESS) && !(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) if (tar_handle->src_fd < 0)
bb_perror_msg_and_die("can't open '%s'", tar_filename); bb_perror_msg_and_die("can't open '%s'", tar_filename);
} else { } else {

View File

@ -736,12 +736,12 @@ extern void *xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p) FAS
#if SEAMLESS_COMPRESSION #if SEAMLESS_COMPRESSION
/* Autodetects gzip/bzip2 formats. fd may be in the middle of the file! */ /* 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 */ /* 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 #else
# define setup_unzip_on_fd(...) (0) # 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 #endif
extern void *xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; extern void *xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;

View File

@ -353,7 +353,7 @@ static void fb_drawimage(void)
if (LONE_DASH(G.image_filename)) { if (LONE_DASH(G.image_filename)) {
theme_file = stdin; theme_file = stdin;
} else { } else {
int fd = open_zipped(G.image_filename); int fd = open_zipped(G.image_filename, /*fail_if_not_compressed:*/ 0);
if (fd < 0) if (fd < 0)
bb_simple_perror_msg_and_die(G.image_filename); bb_simple_perror_msg_and_die(G.image_filename);
theme_file = xfdopen_for_read(fd); theme_file = xfdopen_for_read(fd);

View File

@ -102,7 +102,7 @@ static int run_pipe(const char *pager, char *man_filename, int man, int level)
ordinary_manpage: ordinary_manpage:
close(STDIN_FILENO); 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. /* "2>&1" is added so that nroff errors are shown in pager too.
* Otherwise it may show just empty screen */ * Otherwise it may show just empty screen */
cmd = xasprintf( cmd = xasprintf(