From f4fc303e3679e4ab0d45f60c31f9b687f27f7452 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 27 Nov 2018 11:26:48 +0100 Subject: [PATCH] tar: fix too eager autodetection, closes 11531 function old new delta is_suffixed_with - 54 +54 tar_main 1006 1026 +20 open_transformer 92 79 -13 config_file_action 478 458 -20 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/2 up/down: 74/-33) Total: 41 bytes Signed-off-by: Denys Vlasenko --- archival/libarchive/open_transformer.c | 3 +-- archival/tar.c | 8 ++++++++ modutils/modprobe.c | 5 ++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c index 9fefd4aad..4a4bf3916 100644 --- a/archival/libarchive/open_transformer.c +++ b/archival/libarchive/open_transformer.c @@ -278,8 +278,7 @@ static transformer_state_t *open_transformer(const char *fname, int fail_if_not_ if (ENABLE_FEATURE_SEAMLESS_LZMA) { /* .lzma has no header/signature, can only detect it by extension */ - char *sfx = strrchr(fname, '.'); - if (sfx && strcmp(sfx+1, "lzma") == 0) { + if (is_suffixed_with(fname, ".lzma")) { xstate = xzalloc(sizeof(*xstate)); xstate->src_fd = fd; xstate->xformer = unpack_lzma_stream; diff --git a/archival/tar.c b/archival/tar.c index 1c71f7f66..6950c271d 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -1162,8 +1162,16 @@ int tar_main(int argc UNUSED_PARAM, char **argv) tar_handle->seek = seek_by_read; } else if (ENABLE_FEATURE_TAR_AUTODETECT + && ENABLE_FEATURE_SEAMLESS_LZMA && flags == O_RDONLY && !(opt & OPT_ANY_COMPRESS) + && is_suffixed_with(tar_filename, ".lzma") + /* We do this only for .lzma files, they have no signature. + * All other compression formats are recognized in + * get_header_tar() when first tar block has invalid format. + * Doing it here for all filenames would falsely trigger + * on e.g. tarball with 1st file named "BZh5". + */ ) { tar_handle->src_fd = open_zipped(tar_filename, /*fail_if_not_compressed:*/ 0); if (tar_handle->src_fd < 0) diff --git a/modutils/modprobe.c b/modutils/modprobe.c index 59f6d54f3..291e4cb90 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -245,7 +245,7 @@ static int FAST_FUNC config_file_action(const char *filename, parser_t *p; struct module_entry *m; int rc = TRUE; - const char *base, *ext; + const char *base; /* Skip files that begin with a "." */ base = bb_basename(filename); @@ -266,8 +266,7 @@ static int FAST_FUNC config_file_action(const char *filename, * "include FILE_NOT_ENDING_IN_CONF" must work too. */ if (depth != 0) { - ext = strrchr(base, '.'); - if (ext == NULL || strcmp(ext + 1, "conf")) + if (!is_suffixed_with(base, ".conf")) goto error; } -- 2.25.1