[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

tarfs: fails to read tar.gz files.

From: Cyril Roelandt
Subject: tarfs: fails to read tar.gz files.
Date: Wed, 22 Aug 2012 03:34:10 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.5) Gecko/20120624 Icedove/10.0.5

Hi !

I've just tried tarfs, and it seems to me that it does not handle tar.gz files very well. I got the code from the Hurd incubator, compiled it, and ran the following commands to create a simple tar.gz file:

$ mkdir -p a/b/c
$ touch a/foo
$ touch a/b/c/bar
$ tar czvf foobar.tar.gz a/

Here is what I got when trying to run tarfs:

$ settrans -ca ./foobar ./tarfs -z ./foobar.tar.gz -D -
gzip_open: Underlying file size is 183 bytes
gzip_read_header: Gzip compression method: 0x08
gzip_open: start_file_offs = 10
gzip_stream_read: End of file
gzip_stream_read: offset file/zip = 10 / 0
gzip_stream_read: avail in/out = 173 / 8192
gzip_stream_read: requested/read = 8192 / 8192
gzip_stream_read: offset file/zip = 170 / 8192
gzip_stream_read: avail in/out = 13 / 8192
gzip_stream_read: End of stream
gzip_verify_crc: Valid gzip CRC
gzip_verify_crc: Valid gzip uncompressed stream size (10240)
gzip_stream_read: requested/read = 8192 / 2048
traverse: file traversed (offset file/zip = 175 / 10240)
gzip_open: Uncompressed stream size is 10240
gzip_stream_read: End of file
gzip_stream_read: offset file/zip = 10 / 0
gzip_stream_read: avail in/out = 173 / 512
gzip_error: zlib error: stream error
gzip_stream_read: requested/read = 512 / 0
./tarfs: Read error (offset=0): Invalid argument
settrans: ./tarfs: Translator died

I think this is caused by the call to ZIP_DECOMPRESS in the "ZIP (stream_read)" function. It fails when stream->next_out is NULL (cf. http://www.zlib.net/manual.html : inflate() returns Z_STREAM_ERROR if the next_out field is NULL).

stream->next_out is set in zipstores.c, at line 370:

stream->next_out  = (uchar *) buf;

"buf" is a parameter of the "ZIP (stream_read)" function, which is called by the "ZIP (read)" function:

static error_t
ZIP (read) (struct store *store,
            store_offset_t offset, size_t index, size_t amount, void **buf,
            size_t *len)

This function is called with *buf == NULL, which, I think, leads to the failure of tarfs.

Anyone has any idea how to fix this ?

I'm running Debian GNU/Hurd.

Cyril Roelandt.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]