[git commit] tar: fix exitcode check for MMU-spawned unpacking helpers

Denys Vlasenko vda.linux at googlemail.com
Tue Nov 19 13:44:04 UTC 2013


commit: http://git.busybox.net/busybox/commit/?id=ebfa9b5aa1f1f6cd4949e1be03ebf1ce074727d1
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Testcase: tar xvzf EMPTY_FILE

function                                             old     new   delta
open_transformer                                     102     106      +4
get_header_tar                                      1781    1785      +4

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 archival/libarchive/get_header_tar.c   |   14 +++++++-------
 archival/libarchive/open_transformer.c |    5 +++--
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c
index bc09756..32f8420 100644
--- a/archival/libarchive/get_header_tar.c
+++ b/archival/libarchive/get_header_tar.c
@@ -198,13 +198,13 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
 	 * the message and we don't check whether we indeed
 	 * saw zero block directly before this. */
 	if (i == 0) {
-		xfunc_error_retval = 0;
- short_read:
-		bb_error_msg_and_die("short read");
+		bb_error_msg("short read");
+		/* this merely signals end of archive, not exit(1): */
+		return EXIT_FAILURE;
 	}
 	if (i != 512) {
 		IF_FEATURE_TAR_AUTODETECT(goto autodetect;)
-		goto short_read;
+		bb_error_msg_and_die("short read");
 	}
 
 #else
@@ -221,10 +221,10 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
 			 */
 			while (full_read(archive_handle->src_fd, &tar, 512) == 512)
 				continue;
-			return EXIT_FAILURE;
+			return EXIT_FAILURE; /* "end of archive" */
 		}
 		archive_handle->tar__end = 1;
-		return EXIT_SUCCESS;
+		return EXIT_SUCCESS; /* "decoded one header" */
 	}
 	archive_handle->tar__end = 0;
 
@@ -471,5 +471,5 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
 	free(file_header->tar__uname);
 	free(file_header->tar__gname);
 #endif
-	return EXIT_SUCCESS;
+	return EXIT_SUCCESS; /* "decoded one header" */
 }
diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c
index 4e44a87..4e98264 100644
--- a/archival/libarchive/open_transformer.c
+++ b/archival/libarchive/open_transformer.c
@@ -79,16 +79,17 @@ void FAST_FUNC open_transformer(int fd, const char *transform_prog)
 		// FIXME: error check?
 #if BB_MMU
 		{
+			IF_DESKTOP(long long) int r;
 			transformer_aux_data_t aux;
 			init_transformer_aux_data(&aux);
 			aux.check_signature = check_signature;
-			transformer(&aux, fd, fd_pipe.wr);
+			r = transformer(&aux, fd, fd_pipe.wr);
 			if (ENABLE_FEATURE_CLEAN_UP) {
 				close(fd_pipe.wr); /* send EOF */
 				close(fd);
 			}
 			/* must be _exit! bug was actually seen here */
-			_exit(EXIT_SUCCESS);
+			_exit(/*error if:*/ r < 0);
 		}
 #else
 		{


More information about the busybox-cvs mailing list