[PATCH] Correct exit codes for invalid tar archives

Cristian Ionescu-Idbohrn cristian.ionescu-idbohrn at axis.com
Thu Nov 21 11:46:24 UTC 2013


On Wed, 20 Nov 2013, Denys Vlasenko wrote:
>
> Your patch makes tar die on read < 512 bytes at once, without
> considering the possibility that it was a perfectly valid gzipped tarball
> which become shorter than 512 bytes after gzipping.
>
> The code before patch is:
>
>         i = full_read(archive_handle->src_fd, &tar, 512);
>         if (i == 0) {
>                 xfunc_error_retval = 0;
>                 bb_error_msg_and_die("short read");
>         }
>         if (i != 512) {
>                 IF_FEATURE_TAR_AUTODETECT(goto autodetect;)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOTE THIS
>                 bb_error_msg_and_die("short read");
>         }
>
> You make it impossible to reach that line.

Of course you're right.  Got it now.

> In fact I think you are right, zero-sized file is likely
> a result of error somewhere (a failed download or tarball creation)
> and it's better to refuse to process such "tarball". I fixed it in git.

Sounds good.  `tar' with the latest patches works for us.  Thanks.

Did some more tests.  Files of /dev/zero and /dev/urandom bytes;
sizes 1, 2, 3, 511, 512, 513, 1023, 1034, 1025 bytes.

I use GNU tar 1.26. Found one discrepancy, though

	$ bb-tar tf ../data/1023.zero-bytes;echo $?
	tar: invalid tar magic
	1
	$ gnu-tar tf ../data/1023.zero-bytes;echo $?
	tar: A lone zero block at 1
	0

I'm not sure busybox-tar needs to care about that one, but you decide.


Cheers,

-- 
Cristian


More information about the busybox mailing list