Browse Source

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 <vda.linux@googlemail.com>
Denys Vlasenko 5 years ago
parent
commit
f4fc303e36
3 changed files with 11 additions and 5 deletions
  1. 1 2
      archival/libarchive/open_transformer.c
  2. 8 0
      archival/tar.c
  3. 2 3
      modutils/modprobe.c

+ 1 - 2
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;

+ 8 - 0
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)

+ 2 - 3
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;
 	}