tar: fix exitcode check for MMU-spawned unpacking helpers
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 19 Nov 2013 13:44:04 +0000 (14:44 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 19 Nov 2013 13:44:04 +0000 (14:44 +0100)
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@googlemail.com>
archival/libarchive/get_header_tar.c
archival/libarchive/open_transformer.c

index bc09756ba35c2fff3fcf13168109fb936c796473..32f842095fe5e39c8ecf40f538de1e0b6cdf30fd 100644 (file)
@@ -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" */
 }
index 4e44a87e9e816564acd55021434b3dbf4be75f3e..4e98264418709116d430b4749e1339a31e9a4acc 100644 (file)
@@ -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
                {