python-delta-tar
6 years agouse real new volume handler during rescue
Philipp Gesang [Fri, 25 Aug 2017 15:41:21 +0000]
use real new volume handler during rescue

With the dummy we end up with a nil object instead of a tarinfo
at the end of the volume. Reinstating the actual handler is
harmless and produces a valid info object again.

6 years agoprevent tarobject iteration in disaster mode
Philipp Gesang [Fri, 25 Aug 2017 15:03:37 +0000]
prevent tarobject iteration in disaster mode

The tarfile iterator relies on the header data to determine the
next object offset which may be wrong for corrupt files. Instead,
skip that iteration step and completely rely on the object
offsets determined during index rebuild.

6 years agoimplement tolerant GNU tar header parser
Philipp Gesang [Fri, 25 Aug 2017 12:23:17 +0000]
implement tolerant GNU tar header parser

When skimming a file for tar objects, only consider the GNU
header magic and whether the blocks are aligned.

6 years agoadd restore helper handling for reconstructed indices
Philipp Gesang [Fri, 25 Aug 2017 09:12:39 +0000]
add restore helper handling for reconstructed indices

6 years agoadd iterator mode for reconstructed index
Philipp Gesang [Fri, 25 Aug 2017 08:27:39 +0000]
add iterator mode for reconstructed index

6 years agounify construction of secret values
Philipp Gesang [Fri, 25 Aug 2017 07:33:49 +0000]
unify construction of secret values

6 years agoimplement tolerant gz header parser
Philipp Gesang [Thu, 24 Aug 2017 15:24:36 +0000]
implement tolerant gz header parser

Since they assume a stream object, we cannot rely on the original
tarfile GZ handling. Add a “tolerant” one according to the format
spec that notices malformed or unexpected (in Deltatar context)
values, but glosses over them if they do not necessarily impact
the readability of the object.

Also use the new symbolic constants in the existing GZ reader
instead of magic numbers.

6 years agoignore GCM tag mismatch in scan mode
Philipp Gesang [Thu, 24 Aug 2017 14:48:32 +0000]
ignore GCM tag mismatch in scan mode

Header info is assumed unreliable during rescue so a tag mismatch
must not result in a bad object.

6 years agoconvert TarInfo to index format
Philipp Gesang [Thu, 24 Aug 2017 11:21:30 +0000]
convert TarInfo to index format

6 years agoread tar objects at predetermined offsets for rescue index
Philipp Gesang [Thu, 24 Aug 2017 09:57:53 +0000]
read tar objects at predetermined offsets for rescue index

Leverage the tarobj to read the object headers at the determined
offsets. Currently only implemented for encrypted archives whose
offsets are located with *crypto.py*.

6 years agoadd test skeleton for corrupt index reconstruction
Philipp Gesang [Thu, 24 Aug 2017 09:56:14 +0000]
add test skeleton for corrupt index reconstruction

Starting with an intact backup set.

6 years agodraft rescue mode through all layers
Philipp Gesang [Wed, 23 Aug 2017 08:49:36 +0000]
draft rescue mode through all layers

The strategy is for rescue mode to reconstruct the relevant [*]
information from the index by inspecting the passed tar object,
then continue from there. On the crypto side, this boils down to
a streamlined (and silent) version of the “scan” mode. The
tarfile side is still WIP.

[*] Omitting the useless parts like inode number.

6 years agoderive test skeleton for disaster rescue mode
Philipp Gesang [Tue, 22 Aug 2017 15:17:04 +0000]
derive test skeleton for disaster rescue mode

6 years agoimplement dump mode for tolerant decryption
Philipp Gesang [Tue, 22 Aug 2017 15:06:41 +0000]
implement dump mode for tolerant decryption

Utilize the safe dirfd based implementation from split mode to
write extracted objects to a target directory.

6 years agoextend tarfile API for rescue mode
Philipp Gesang [Tue, 22 Aug 2017 13:30:15 +0000]
extend tarfile API for rescue mode

6 years agoimplement decryption for tolerant mode
Philipp Gesang [Tue, 22 Aug 2017 11:29:45 +0000]
implement decryption for tolerant mode

Not possible to reuse the existing CLI decryption since we’re
operating with fds in scan mode.

6 years agoattempt to process candidate objects in scan mode
Philipp Gesang [Tue, 22 Aug 2017 09:59:35 +0000]
attempt to process candidate objects in scan mode

6 years agoprint list of header candidates
Philipp Gesang [Tue, 22 Aug 2017 08:25:21 +0000]
print list of header candidates

6 years agoimplement PDTCRYPT header scanning
Philipp Gesang [Tue, 15 Aug 2017 15:37:12 +0000]
implement PDTCRYPT header scanning

First phase: collect all possible header start locations.

Adds a CLI subcommand “scan” to crypto.py for analyzing files.

6 years agotest corruption by tearing a hole in a volume
Philipp Gesang [Tue, 15 Aug 2017 14:54:30 +0000]
test corruption by tearing a hole in a volume

6 years agoadd test corrupting an entire volume
Philipp Gesang [Tue, 15 Aug 2017 13:38:17 +0000]
add test corrupting an entire volume

Zero out the first volume: None of the content can be restored.
This includes the file extending from the first into the second
volume.

6 years agouse symbolic constant for errno
Philipp Gesang [Tue, 15 Aug 2017 12:42:35 +0000]
use symbolic constant for errno

6 years agoclarify index read failure
Philipp Gesang [Tue, 15 Aug 2017 09:14:01 +0000]
clarify index read failure

Instead of erroring out with an exception, make --restore emit an
error message indicating that something is wrong with the index.

6 years agodo not discard valid data in buffers when in tolerant mode
Philipp Gesang [Tue, 15 Aug 2017 08:31:15 +0000]
do not discard valid data in buffers when in tolerant mode

Both decryption and decompression will fail on the first error
and ignore any results of earlier passes. In normal operation,
the hard failures are desirable to indicate a bad backup set.

However, in tolerant / recovery mode the error handling is closer
to the opposite extreme: we want to retrieve every last byte that
made it through the various layers and only skip over the parts
that cannot be interpreted at all.

6 years agocatch bad parameter version in header
Philipp Gesang [Mon, 14 Aug 2017 15:24:56 +0000]
catch bad parameter version in header

6 years agoreject bad index files with a meaningful error
Philipp Gesang [Mon, 14 Aug 2017 14:04:53 +0000]
reject bad index files with a meaningful error

6 years agoadd brief description of disaster recovery
Philipp Gesang [Mon, 14 Aug 2017 13:10:44 +0000]
add brief description of disaster recovery

6 years agofail with info message if recovery is asked with source path
Philipp Gesang [Mon, 14 Aug 2017 12:14:16 +0000]
fail with info message if recovery is asked with source path

6 years agoallow for numbers of missing and failed files to differ in recovery test
Philipp Gesang [Mon, 14 Aug 2017 10:09:28 +0000]
allow for numbers of missing and failed files to differ in recovery test

6 years agoadjust the expectations about checksum mismatches with non-authenticated recover...
Philipp Gesang [Mon, 14 Aug 2017 09:54:17 +0000]
adjust the expectations about checksum mismatches with non-authenticated recover modes

6 years agouse index iterator to accomodate multivol extraction
Philipp Gesang [Mon, 14 Aug 2017 09:35:18 +0000]
use index iterator to accomodate multivol extraction

For reasons unknown, the “tar path iterator” always terminates
after the last element of the first volume. In fact, it does so
even for multi volume archives if the last object in the first
volume extends into the second volume. In this case, the object
is completely extracted but extraction terminates.

6 years agouse random data in multivol tests
Philipp Gesang [Fri, 11 Aug 2017 14:41:51 +0000]
use random data in multivol tests

Brute force incompressibility to preven gzip from invalidating
our multivolume tests.

6 years agogive each recovery test a multivol companion
Philipp Gesang [Fri, 11 Aug 2017 13:45:50 +0000]
give each recovery test a multivol companion

This derives single- and multivolume versions of the tests.
Multiple volumes are generated by stretching the input file count
and size.

6 years agowork around false positives in deltatar fs checks during rpmbuild
Philipp Gesang [Fri, 11 Aug 2017 12:16:56 +0000]
work around false positives in deltatar fs checks during rpmbuild

These only happen when running in rpmbuild, otherwise the tests
are fine. Of course, on RHBT the choir resoundeth “thou shalt not
run thine rpm build as root” but that’s not really an option
here.

6 years agocatch incomplete trailing header in tolerant recovery
Philipp Gesang [Fri, 11 Aug 2017 09:50:55 +0000]
catch incomplete trailing header in tolerant recovery

This makes decryption in recovery mode resistant against
malformed trailing data which would otherwise error out for the
entire buffered chunk on account of a decryption failure.

6 years agotest recovery behavior with traling data
Philipp Gesang [Fri, 11 Aug 2017 09:39:42 +0000]
test recovery behavior with traling data

6 years agotrack successful recover of corrupted payload in tests
Philipp Gesang [Fri, 11 Aug 2017 09:16:33 +0000]
track successful recover of corrupted payload in tests

Gzip does CRC32, GCM has a MAC, but ordinary Tar only checksums
the header part, not the content. Thus recovery of a damaged
object will appear to succeed provided the object header is
intact. In order to detect the corruption, an external integrity
check is necessary.

6 years agoadd recover tests for completely damaged headers
Philipp Gesang [Fri, 11 Aug 2017 08:53:09 +0000]
add recover tests for completely damaged headers

6 years agosync tarfile stream diligently when writing new objects
Philipp Gesang [Fri, 11 Aug 2017 08:25:12 +0000]
sync tarfile stream diligently when writing new objects

Turns out all the offsets written to the index when neither
encrypting nor compressing were, well, … off. In fact they would
only be updated at tar block boundaries due to buffering. Since
“last_block_offset” record keeping blatantly violates layering
boundaries, it would only work reliably with the concat
compression and encryption modes that do the same.

Sync when adding a new object so we get the accurate offset
value. Voilà, recovery now works with uncompressed and
unencrypted archives as well

6 years agoadd header corruption tests
Philipp Gesang [Thu, 10 Aug 2017 15:01:42 +0000]
add header corruption tests

We hit them where it hurts:

    * for compressed backups, flip a bit in the magic;
    * for encrypted backups, flip a bit in the tag.

In either case, normal restore must fail, and disaster recovery
will be incomplete.

6 years agoadd test for corruption of encrypted files
Philipp Gesang [Thu, 10 Aug 2017 13:32:16 +0000]
add test for corruption of encrypted files

6 years agotrack irrecoverable files in test_recover
Philipp Gesang [Thu, 10 Aug 2017 12:39:40 +0000]
track irrecoverable files in test_recover

6 years agoprefer index iterator for recovery
Philipp Gesang [Thu, 10 Aug 2017 11:06:30 +0000]
prefer index iterator for recovery

6 years agoproperly damage gzip files for recover test
Philipp Gesang [Thu, 10 Aug 2017 09:38:39 +0000]
properly damage gzip files for recover test

Ensure we are flipping bits in the compressed payload, not in the
mostly useless header. Requires some extra parsing to determine
the header length.

6 years agoadd bit flip helper for recover tests
Philipp Gesang [Thu, 10 Aug 2017 08:34:15 +0000]
add bit flip helper for recover tests

6 years agofix misleading docstrings for index file hook
Philipp Gesang [Thu, 10 Aug 2017 08:13:18 +0000]
fix misleading docstrings for index file hook

6 years agolay out skeleton for disaster recovery tests
Philipp Gesang [Thu, 10 Aug 2017 07:37:08 +0000]
lay out skeleton for disaster recovery tests

New series of tests for corrupting backup sets and restoring them
incompletely (“tolerant” or “disaster recovery” mode).

6 years agodraft disaster recovery mode for deltatar
Philipp Gesang [Tue, 8 Aug 2017 11:58:20 +0000]
draft disaster recovery mode for deltatar

The first stage recovery assumes the index is intact and all
objects are at their expected position. In this scenario, an
attempt is made to extract each object, keeping track of those
that weren’t readable and why.

6 years agoreturn valid decrypted data on decryption failure
Philipp Gesang [Tue, 8 Aug 2017 10:03:01 +0000]
return valid decrypted data on decryption failure

6 years agoforce tarfile reopen after bad read in deltatar
Philipp Gesang [Tue, 8 Aug 2017 08:48:31 +0000]
force tarfile reopen after bad read in deltatar

Closing the tarfile after an unreadable object was encountered
causes the stream to be reopened for the next read. Otherwise,
the corrupt object is already buffered and tarfile would continue
to seek inside the bad data.

6 years agodistinguish invalid files from parse errors in restore
Philipp Gesang [Tue, 8 Aug 2017 07:44:56 +0000]
distinguish invalid files from parse errors in restore

Especially with index files, the parse error is misleading.
Indicate the prevalent cause of the problem, i. e. that the
file is compressed but compression was not requested during
restore.

6 years agoupdate help usage strings wrt. crypto in backup.py
Philipp Gesang [Tue, 8 Aug 2017 07:14:12 +0000]
update help usage strings wrt. crypto in backup.py

6 years agoextend crypto.py exception descriptions
Philipp Gesang [Mon, 7 Aug 2017 13:37:19 +0000]
extend crypto.py exception descriptions

6 years agoactually default to i2n mode with crypto.py scrypt
Philipp Gesang [Tue, 27 Jun 2017 08:24:00 +0000]
actually default to i2n mode with crypto.py scrypt

And adapt the relevant unit test to explicitly request the full
parameters output.

6 years agoadd crypto.py option to output cnf-compatible scrypt object
Philipp Gesang [Fri, 23 Jun 2017 08:35:08 +0000]
add crypto.py option to output cnf-compatible scrypt object

6 years agosupport PDT encrypted archives with rescue_tar.py
Philipp Gesang [Wed, 31 May 2017 11:53:21 +0000]
support PDT encrypted archives with rescue_tar.py

6 years agoadapt file_crypt.py for revised crypto
Philipp Gesang [Tue, 30 May 2017 15:29:26 +0000]
adapt file_crypt.py for revised crypto

6 years agokill off old crypto implementation
Philipp Gesang [Tue, 30 May 2017 15:10:59 +0000]
kill off old crypto implementation

The old aescrypto.py was only kept for reference but since
downstream integration is more or less complete wrt. encryption
we don’t need it any longer.

Good riddance.

6 years agoallow passing salt to crypto.py on the command line
Philipp Gesang [Tue, 30 May 2017 10:40:19 +0000]
allow passing salt to crypto.py on the command line

Nifty shortcut for hashing without a corresponding pdtcrypt file.

6 years agoproperly align usage message of crypto.py
Philipp Gesang [Tue, 30 May 2017 09:23:57 +0000]
properly align usage message of crypto.py

6 years agoimprove bad CLI argument handling of crypto.py
Philipp Gesang [Tue, 23 May 2017 12:55:10 +0000]
improve bad CLI argument handling of crypto.py

6 years agoinclude header version info in scrypt handler
Philipp Gesang [Mon, 22 May 2017 12:10:33 +0000]
include header version info in scrypt handler

6 years agoaccept crypto format version in deltatar ctor
Philipp Gesang [Fri, 19 May 2017 15:22:17 +0000]
accept crypto format version in deltatar ctor

6 years agoadd unit test for CLI scrypt hashing
Philipp Gesang [Fri, 19 May 2017 09:16:10 +0000]
add unit test for CLI scrypt hashing

6 years agoallow passing keys directly to CLI crypto.py
Philipp Gesang [Thu, 18 May 2017 15:47:25 +0000]
allow passing keys directly to CLI crypto.py

Keys may now be passed as command line argument or environment
variable.

The only valid format is 16 bytes in hexadecimal.

6 years agograb password from envp if not supplied on CLI
Philipp Gesang [Thu, 18 May 2017 11:44:07 +0000]
grab password from envp if not supplied on CLI

In order to avoid the password showing up in full in the process
table, pass it in the environment instead. Uses the environment
variable PDTCRYPT_PASSWORD with both crypto.py and backup.py.

6 years agodefault to index mode of deltatar object when choosing extension
Philipp Gesang [Tue, 16 May 2017 11:37:43 +0000]
default to index mode of deltatar object when choosing extension

For external use.

6 years agohandle bad randomness during IV creation
Philipp Gesang [Tue, 16 May 2017 08:57:01 +0000]
handle bad randomness during IV creation

Since IVs must be unique we rely on /dev/urandom to yield a
different sequence of bytes when requesting a new fixed part.
In the unlikely event that a new fixed part has already been
used earlier, repeat it for number of times.

Abort if no unique IV could be generated this way since it
most likely indicates a faulty RNG.

6 years agoextend crypto.py documentation
Philipp Gesang [Mon, 15 May 2017 15:44:48 +0000]
extend crypto.py documentation

6 years agodistinguish auxiliary file errors
Philipp Gesang [Thu, 11 May 2017 15:40:21 +0000]
distinguish auxiliary file errors

Auxiliary files that grow larger than the maximum defined
encrypted file size cause an irrecoverable error because their
fixed IV is being reused. Add a new exception to distinguish this
specific case. Encrypted auxiliary files thus never consist of
more than one object, no on-the-fly continuation is permitted
like with ordinary files.

6 years agoadapt unit tests for crypto.py subcommands
Philipp Gesang [Thu, 11 May 2017 09:28:08 +0000]
adapt unit tests for crypto.py subcommands

6 years agoexport scrypt hashing functionality
Philipp Gesang [Thu, 11 May 2017 08:50:30 +0000]
export scrypt hashing functionality

6 years agoadd SCRYPT hashing mode to crypto.py
Philipp Gesang [Thu, 11 May 2017 08:35:40 +0000]
add SCRYPT hashing mode to crypto.py

Add a subcommand “scrypt” to crypto.py in CLI mode. Example:

    $ python3 ./deltatar/crypto.py scrypt foo -i - -o pwd   \
        <backup_dir/bfull-2017-05-11-0919-001.tar.pdtcrypt
    {"scrypt_params": {"p": 1, "N": 65536, "dkLen": 16, "r": 8},
     "salt": "b'fbdbaa9890ae243eb16391199c9243f6'", "hash":
     "b'1e7d7a78b9300d461779e9c80e4a15ac'"}

The output “hash” is calculated from the salt in the first
header found in the given archive and the password specified.

6 years agograciously handle GCM data length limit
Philipp Gesang [Tue, 9 May 2017 13:42:17 +0000]
graciously handle GCM data length limit

6 years agounit test crypto file counter wraparound
Philipp Gesang [Tue, 9 May 2017 08:59:28 +0000]
unit test crypto file counter wraparound

After the file counter reaches UINT_MAX, it wraps around and a
new fixed part must be created.

The file counter is 32 bit unsigned integer so it needs to be
lowered to make bounds testing feasible.

6 years agoextend strict iv tracking to encryption
Philipp Gesang [Tue, 9 May 2017 08:22:43 +0000]
extend strict iv tracking to encryption

This is just an extra soundness check to prevent accidental reuse
if IVs when handled incorrectly (same initial counters passed
twice to the same context). In normal usage this case cannot
happen.

6 years agoexpand crypto api to accept precomputed key
Philipp Gesang [Mon, 8 May 2017 14:27:13 +0000]
expand crypto api to accept precomputed key

6 years agoreduce noise in test_multivol_compression_sizes.py
Philipp Gesang [Mon, 8 May 2017 15:13:26 +0000]
reduce noise in test_multivol_compression_sizes.py

6 years agoimprove iv diagnostics when decrypting
Philipp Gesang [Mon, 8 May 2017 13:33:29 +0000]
improve iv diagnostics when decrypting

6 years agotest that seeking backwards is disallowed by _Stream
Philipp Gesang [Mon, 8 May 2017 09:26:54 +0000]
test that seeking backwards is disallowed by _Stream

Re-extracting an already decrypted file will fail on account of
IV reuse. Currently, tarfile._Stream is not capable of performing
backward seeks, so we’re good. Should this limitation be removed
in a future version, this unit test will fail.

6 years agoremove pytest dependency from test_crypto.py
Philipp Gesang [Mon, 8 May 2017 07:58:33 +0000]
remove pytest dependency from test_crypto.py

6 years agoadd unit test for IV reuse
Philipp Gesang [Fri, 5 May 2017 15:52:51 +0000]
add unit test for IV reuse

6 years agoadapt crypto unit tests to run in main suite
Philipp Gesang [Fri, 5 May 2017 15:18:11 +0000]
adapt crypto unit tests to run in main suite

6 years agoremove IV validation step from RestoreHelper
Philipp Gesang [Fri, 5 May 2017 14:52:45 +0000]
remove IV validation step from RestoreHelper

Since the same decryption context is carried over between the Tar
volumes of one backup set, the built-in IV uniqueness checks
suffice. Between multiple backup sets, the salt and IV fixed
parts change, so there is no occasion for conflict. The IVs of
auxiliary files are unique anyways.

6 years agoadjust acceptable size window for compressed unit test data
Philipp Gesang [Fri, 5 May 2017 12:27:29 +0000]
adjust acceptable size window for compressed unit test data

A low bound of 330 causes the test to fail with version 1.2.3 of
zlib.

Earlier this did not occur because in concat mode, tarfile would
always write an empty zlib compressed chunk right at the
beginning of the archive and then immediately create a new one as
soon as actual input arrived. For this reason, the resulting
archive size remained within the bounds chosen in
test_multivol.py. Due to the removal of the redundancy, this is
no longer the case. The problem is masked on newer versions of
zlib (tested: 1.2.8 of fc25) which create larger compressed files
in general for the same inputs.

For the “test_compress_single” unit test, the input consists of a
an archive 61440 bytes. Compress with level 9, window bits 31,
and a memlevel of 9, the output length is:

    version     size (B)
    1.2.3       308
    1.2.8       324

Add to that the file name in our custom header and the latter
passes 330 B whereas the former doesn’t.

A lower bound of 315 is justified.

6 years agoreuse existing crypto context for subsequent volumes
Philipp Gesang [Fri, 5 May 2017 09:00:37 +0000]
reuse existing crypto context for subsequent volumes

6 years agovalidate exceptions being thrown from invalid tarfile.open() params
Philipp Gesang [Fri, 5 May 2017 08:20:50 +0000]
validate exceptions being thrown from invalid tarfile.open() params

6 years agomove final IV checks out of crypto context
Philipp Gesang [Thu, 4 May 2017 16:06:04 +0000]
move final IV checks out of crypto context

Collect IVs while decrypting but postpone the final check for
duplicates. Reused IVs still trigger an exception during
decryption but since multiple different contexts may be active
(e. g. when handling a diff backup), the IVs they retrieved from
the headers must be compared afterwards. This test has its place
in a new function “validate” of the ``RestoreHelper`` and must be
called when decryption has been completed.

6 years agowrite auxiliary files whilst processing the backup
Philipp Gesang [Thu, 4 May 2017 13:12:50 +0000]
write auxiliary files whilst processing the backup

Introduce a fixed value for the index file counter to allow
encryption on the fly.

6 years agouse independent decryption contexts for backup files
Philipp Gesang [Thu, 4 May 2017 12:24:06 +0000]
use independent decryption contexts for backup files

When restoring individual files from a diff backup, Deltatar will
traverse both tarballs simultaneously. This leads to access
patterns where reads are interleaved between the two sources,
possibly corrupting the decryption state. Thus when restoring
from multiple “index files” (in practice only two are relevant),
use a separate decryptor context for each of them.

6 years agoclean up multi-index handling
Philipp Gesang [Tue, 2 May 2017 14:14:44 +0000]
clean up multi-index handling

WIP

6 years agoproperly handle encryption and compression of empty archives
Philipp Gesang [Tue, 2 May 2017 15:59:19 +0000]
properly handle encryption and compression of empty archives

The old implementation always initialized in the ctor regardless
of whether contents would be written to the archive. For empty
archives this now has to be done in ``.close()`` if no data has
been added yet.

6 years agoadapt test_multivol_compression_sizes.py to revised crypto
Philipp Gesang [Tue, 2 May 2017 14:44:43 +0000]
adapt test_multivol_compression_sizes.py to revised crypto

6 years agoremove redundant test
Philipp Gesang [Tue, 2 May 2017 13:06:24 +0000]
remove redundant test

The first part of the condition always evaluates to True since
it’s the precondition to entering that branch.

6 years agoencode operation modes
Philipp Gesang [Fri, 28 Apr 2017 16:06:27 +0000]
encode operation modes

Introduce the “arcmode” to comprehensively switch modes to
supplant the pervasive ad-hoc string parsing and attribute
queries. Encodes the triple encryption, compression, concat.

6 years agocleanly perform block transition in non-concat mode
Philipp Gesang [Fri, 28 Apr 2017 12:04:42 +0000]
cleanly perform block transition in non-concat mode

6 years agoclarify exception-driven control flow
Philipp Gesang [Fri, 28 Apr 2017 08:41:27 +0000]
clarify exception-driven control flow

Distinguish the actual EOF when hit at the beginning from other
IO errors in _init_read_gz() and only catch this one where it’s
expected. Well formed archives do not end inside a header.

6 years agoremove unused state variable
Philipp Gesang [Fri, 28 Apr 2017 08:28:29 +0000]
remove unused state variable

“internal_pos” which is only written to and never read was
introduced with this commit:

    commit 85737f48c38a432f2429e9e3e4b81fed164c4b9a
    Author: Eduardo Robles Elvira <edulix@wadobo.com>
    Date:   Fri Jul 5 11:50:43 2013 +0200

        extracting files in r#gz mode now works too, includes unit tests

and lacks a raison d’être ever since.

6 years agouse append mode in symlink unit test
Philipp Gesang [Thu, 27 Apr 2017 15:18:31 +0000]
use append mode in symlink unit test

These tests currently fail despite using the original Gzipfile
compression path. The archives appear to overwrite instead the
passed archive instead of writing new objects.

6 years agofix multivol compression handling
Philipp Gesang [Thu, 27 Apr 2017 14:03:46 +0000]
fix multivol compression handling