pax does not exit with an error if the processed
archive is truncated:

# (cd / && tar zcf - bsd | dd count=128 2>/dev/null | tar tzf -)
bsd
gzip: stdin: Input/output error
tar: End of archive volume 1 reached
gzip: stdout: Broken pipe
tar: Failed write to archive volume: 1: Broken pipe
# echo $?
0


There's two ways to fix this.
1) take the exit code of gzip into account:

Index: ar_io.c
===================================================================
RCS file: /cvs/src/bin/pax/ar_io.c,v
retrieving revision 1.44
diff -u -p -p -u -r1.44 ar_io.c
--- ar_io.c     11 Jan 2014 05:36:26 -0000      1.44
+++ ar_io.c     28 Mar 2014 14:09:37 -0000
@@ -337,8 +337,11 @@ ar_close(void)
        (void)close(arfd);
 
        /* Do not exit before child to ensure data integrity */
-       if (zpid > 0)
+       if (zpid > 0) {
                waitpid(zpid, &status, 0);
+               if (WIFEXITED(status) && WEXITSTATUS(status))
+                       exit_val = 1;
+       }
 
        if (vflag && (artyp == ISTAPE)) {
                (void)fputs("done.\n", listf);

2)
call paxwarn with 1 on truncated reads.
Which will also work for non-gzipped tar files.

Index: ar_io.c
===================================================================
RCS file: /cvs/src/bin/pax/ar_io.c,v
retrieving revision 1.44
diff -u -p -p -u -r1.44 ar_io.c
--- ar_io.c     11 Jan 2014 05:36:26 -0000      1.44
+++ ar_io.c     3 Apr 2014 22:04:07 -0000
@@ -567,7 +570,7 @@ ar_read(char *buf, int cnt)
        if (res < 0)
                syswarn(1, errno, "Failed read on archive volume %d", arvol);
        else
-               paxwarn(0, "End of archive volume %d reached", arvol);
+               paxwarn(1, "End of archive volume %d reached", arvol);
        return(res);
 }
 
Is there a historic reason for this?

Reply via email to