diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2019-01-23 17:42:07 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2019-01-23 17:42:07 +0000 |
commit | 2f15376ba464cf08e710c3353bdacc4f503e11b4 (patch) | |
tree | 646663261d4ebf123dd0bb167d626b6c448dc3b8 /lzip.h | |
parent | Releasing debian version 0.8-2. (diff) | |
download | tarlz-2f15376ba464cf08e710c3353bdacc4f503e11b4.tar.xz tarlz-2f15376ba464cf08e710c3353bdacc4f503e11b4.zip |
Merging upstream version 0.9.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lzip.h')
-rw-r--r-- | lzip.h | 42 |
1 files changed, 38 insertions, 4 deletions
@@ -1,5 +1,5 @@ /* Tarlz - Archiver with multimember lzip compression - Copyright (C) 2013-2018 Antonio Diaz Diaz. + Copyright (C) 2013-2019 Antonio Diaz Diaz. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -53,7 +53,7 @@ inline bool isvalid_ds( const unsigned dictionary_size ) dictionary_size <= max_dictionary_size ); } -const uint8_t lzip_magic[5] = { 0x4C, 0x5A, 0x49, 0x50, 1 }; // "LZIP\1" +const uint8_t lzip_magic[4] = { 0x4C, 0x5A, 0x49, 0x50 }; // "LZIP" struct Lzip_header { @@ -63,14 +63,24 @@ struct Lzip_header enum { size = 6 }; bool verify_magic() const - { return ( std::memcmp( data, lzip_magic, 5 ) == 0 ); } + { return ( std::memcmp( data, lzip_magic, 4 ) == 0 ); } bool verify_prefix( const int sz ) const // detect (truncated) header { - for( int i = 0; i < sz && i < 5; ++i ) + for( int i = 0; i < sz && i < 4; ++i ) if( data[i] != lzip_magic[i] ) return false; return ( sz > 0 ); } + bool verify_corrupt() const // detect corrupt header + { + int matches = 0; + for( int i = 0; i < 4; ++i ) + if( data[i] == lzip_magic[i] ) ++matches; + return ( matches > 1 && matches < 4 ); + } + + uint8_t version() const { return data[4]; } + bool verify_version() const { return ( data[4] == 1 ); } unsigned dictionary_size() const { @@ -109,4 +119,28 @@ struct Lzip_trailer for( int i = 19; i >= 12; --i ) { tmp <<= 8; tmp += data[i]; } return tmp; } + + bool verify_consistency() const // check internal consistency + { + const unsigned crc = data_crc(); + const unsigned long long dsize = data_size(); + if( ( crc == 0 ) != ( dsize == 0 ) ) return false; + const unsigned long long msize = member_size(); + if( msize < min_member_size ) return false; + const unsigned long long mlimit = ( 9 * dsize + 7 ) / 8 + min_member_size; + if( mlimit > dsize && msize > mlimit ) return false; + const unsigned long long dlimit = 7090 * ( msize - 26 ) - 1; + if( dlimit > msize && dsize > dlimit ) return false; + return true; + } }; + + +const char * const bad_magic_msg = "Bad magic number (file not in lzip format)."; +const char * const bad_dict_msg = "Invalid dictionary size in member header."; +const char * const corrupt_mm_msg = "Corrupt header in multimember file."; +const char * const trailing_msg = "Trailing data not allowed."; + +// defined in extract.cc +int readblock( const int fd, uint8_t * const buf, const int size ); +int writeblock( const int fd, const uint8_t * const buf, const int size ); |