diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-06-16 11:13:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-06-16 11:13:24 +0000 |
commit | d7c278fca708bc2c4badaeac041ecb136a4ef955 (patch) | |
tree | 5b163b83e6e3171a311f67187aa75c0f96f98f13 /decoder.cc | |
parent | Adding upstream version 1.23. (diff) | |
download | lziprecover-d7c278fca708bc2c4badaeac041ecb136a4ef955.tar.xz lziprecover-d7c278fca708bc2c4badaeac041ecb136a4ef955.zip |
Adding upstream version 1.24~pre1.upstream/1.24_pre1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | decoder.cc | 39 |
1 files changed, 19 insertions, 20 deletions
@@ -1,5 +1,5 @@ /* Lziprecover - Data recovery tool for the lzip format - Copyright (C) 2009-2022 Antonio Diaz Diaz. + Copyright (C) 2009-2023 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 @@ -37,13 +37,13 @@ const CRC32 crc32; /* Return the number of bytes really read. If (value returned < size) and (errno == 0), means EOF was reached. */ -long long readblock( const int fd, uint8_t * const buf, const long long size ) +long readblock( const int fd, uint8_t * const buf, const long size ) { - long long sz = 0; + long sz = 0; errno = 0; while( sz < size ) { - const int n = read( fd, buf + sz, std::min( 1LL << 20, size - sz ) ); + const long n = read( fd, buf + sz, size - sz ); if( n > 0 ) sz += n; else if( n == 0 ) break; // EOF else if( errno != EINTR ) break; @@ -56,14 +56,13 @@ long long readblock( const int fd, uint8_t * const buf, const long long size ) /* Return the number of bytes really written. If (value returned < size), it is always an error. */ -long long writeblock( const int fd, const uint8_t * const buf, - const long long size ) +long writeblock( const int fd, const uint8_t * const buf, const long size ) { - long long sz = 0; + long sz = 0; errno = 0; while( sz < size ) { - const int n = write( fd, buf + sz, std::min( 1LL << 20, size - sz ) ); + const long n = write( fd, buf + sz, size - sz ); if( n > 0 ) sz += n; else if( n < 0 && errno != EINTR ) break; errno = 0; @@ -109,7 +108,8 @@ void LZ_decoder::flush_data() } -bool LZ_decoder::verify_trailer( const Pretty_print & pp ) const +int LZ_decoder::check_trailer( const Pretty_print & pp, + const bool ignore_empty ) const { Lzip_trailer trailer; int size = rdec.read_data( trailer.data, Lzip_trailer::size ); @@ -162,7 +162,8 @@ bool LZ_decoder::verify_trailer( const Pretty_print & pp ) const tm_size, tm_size, member_size, member_size ); } } - if( error ) return false; + if( error ) return 3; + if( !ignore_empty && data_size == 0 ) return 5; if( verbosity >= 2 ) { if( verbosity >= 4 ) show_header( dictionary_size ); @@ -182,13 +183,15 @@ bool LZ_decoder::verify_trailer( const Pretty_print & pp ) const pp(); std::fprintf( stderr, "Range decoder final code is %08X\n", rdec.get_code() ); } - return true; + return 0; } /* Return value: 0 = OK, 1 = decoder error, 2 = unexpected EOF, - 3 = trailer error, 4 = unknown marker found. */ -int LZ_decoder::decode_member( const Pretty_print & pp ) + 3 = trailer error, 4 = unknown marker found, + 5 = empty member found, 6 = marked member found. */ +int LZ_decoder::decode_member( const Pretty_print & pp, + const bool ignore_empty, const bool ignore_marking ) { Bit_model bm_literal[1<<literal_context_bits][0x300]; Bit_model bm_match[State::states][pos_states]; @@ -208,7 +211,7 @@ int LZ_decoder::decode_member( const Pretty_print & pp ) unsigned rep3 = 0; State state; - rdec.load(); + if( !rdec.load( ignore_marking ) ) return 6; while( !rdec.finished() ) { const int pos_state = data_position() & pos_state_mask; @@ -272,13 +275,9 @@ int LZ_decoder::decode_member( const Pretty_print & pp ) rdec.normalize(); flush_data(); if( len == min_match_len ) // End Of Stream marker - { - if( verify_trailer( pp ) ) return 0; else return 3; - } + return check_trailer( pp, ignore_empty ); if( len == min_match_len + 1 ) // Sync Flush marker - { - rdec.load(); continue; - } + { rdec.load(); continue; } if( verbosity >= 0 ) { pp(); |