1
0
Fork 0

Merging upstream version 1.15~rc1.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-17 22:33:04 +01:00
parent 03e700319c
commit dc06553bd5
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
24 changed files with 472 additions and 466 deletions

View file

@ -38,7 +38,7 @@ static int seek_read( const int fd, uint8_t * const buf, const int size,
}
static bool add_error( struct Lzip_index * const li, const char * const msg )
static bool add_error( Lzip_index * const li, const char * const msg )
{
const int len = strlen( msg );
void * tmp = resize_buffer( li->error, li->error_size + len + 1 );
@ -50,16 +50,15 @@ static bool add_error( struct Lzip_index * const li, const char * const msg )
}
static bool push_back_member( struct Lzip_index * const li,
const long long dp, const long long ds,
const long long mp, const long long ms,
const unsigned dict_size )
static bool push_back_member( Lzip_index * const li, const long long dp,
const long long ds, const long long mp,
const long long ms, const unsigned dict_size )
{
struct Member * p;
Member * p;
void * tmp = resize_buffer( li->member_vector,
( li->members + 1 ) * sizeof li->member_vector[0] );
if( !tmp ) { add_error( li, mem_msg ); li->retval = 1; return false; }
li->member_vector = (struct Member *)tmp;
li->member_vector = (Member *)tmp;
p = &(li->member_vector[li->members]);
init_member( p, dp, ds, mp, ms, dict_size );
++li->members;
@ -67,7 +66,7 @@ static bool push_back_member( struct Lzip_index * const li,
}
static void Li_free_member_vector( struct Lzip_index * const li )
static void Li_free_member_vector( Lzip_index * const li )
{
if( li->member_vector )
{ free( li->member_vector ); li->member_vector = 0; }
@ -75,9 +74,9 @@ static void Li_free_member_vector( struct Lzip_index * const li )
}
static void Li_reverse_member_vector( struct Lzip_index * const li )
static void Li_reverse_member_vector( Lzip_index * const li )
{
struct Member tmp;
Member tmp;
long i;
for( i = 0; i < li->members / 2; ++i )
{
@ -88,8 +87,7 @@ static void Li_reverse_member_vector( struct Lzip_index * const li )
}
static bool Li_check_header( struct Lzip_index * const li,
const Lzip_header header )
static bool Li_check_header( Lzip_index * const li, const Lzip_header header )
{
if( !Lh_check_magic( header ) )
{ add_error( li, bad_magic_msg ); li->retval = 2; return false; }
@ -101,15 +99,14 @@ static bool Li_check_header( struct Lzip_index * const li,
return true;
}
static void Li_set_errno_error( struct Lzip_index * const li,
const char * const msg )
static void Li_set_errno_error( Lzip_index * const li, const char * const msg )
{
add_error( li, msg ); add_error( li, strerror( errno ) );
li->retval = 1;
}
static void Li_set_num_error( struct Lzip_index * const li,
const char * const msg, unsigned long long num )
static void Li_set_num_error( Lzip_index * const li, const char * const msg,
unsigned long long num )
{
char buf[80];
snprintf( buf, sizeof buf, "%s%llu", msg, num );
@ -118,22 +115,19 @@ static void Li_set_num_error( struct Lzip_index * const li,
}
static bool Li_read_header( struct Lzip_index * const li, const int fd,
Lzip_header header, const long long pos, const bool ignore_marking )
static bool Li_read_header( Lzip_index * const li, const int fd,
Lzip_header header, const long long pos )
{
if( seek_read( fd, header, Lh_size, pos ) != Lh_size )
{ Li_set_errno_error( li, "Error reading member header: " ); return false; }
uint8_t byte;
if( !ignore_marking && readblock( fd, &byte, 1 ) == 1 && byte != 0 )
{ add_error( li, marking_msg ); li->retval = 2; return false; }
return true;
}
/* If successful, push last member and set pos to member header. */
static bool Li_skip_trailing_data( struct Lzip_index * const li, const int fd,
static bool Li_skip_trailing_data( Lzip_index * const li, const int fd,
unsigned long long * const pos,
const struct Cl_options * const cl_opts )
const Cl_options * const cl_opts )
{
if( *pos < min_member_size ) return false;
enum { block_size = 16384,
@ -162,8 +156,8 @@ static bool Li_skip_trailing_data( struct Lzip_index * const li, const int fd,
if( member_size > ipos + i || !Lt_check_consistency( *trailer ) )
continue;
Lzip_header header;
if( !Li_read_header( li, fd, header, ipos + i - member_size,
cl_opts->ignore_marking ) ) return false;
if( !Li_read_header( li, fd, header, ipos + i - member_size ) )
return false;
if( !Lh_check( header ) ) continue;
const Lzip_header * header2 = (const Lzip_header *)( buffer + i );
const bool full_h2 = bsize - i >= Lh_size;
@ -178,15 +172,12 @@ static bool Li_skip_trailing_data( struct Lzip_index * const li, const int fd,
{ add_error( li, corrupt_mm_msg ); li->retval = 2; return false; }
if( !cl_opts->ignore_trailing )
{ add_error( li, trailing_msg ); li->retval = 2; return false; }
const unsigned long long data_size = Lt_get_data_size( *trailer );
if( !cl_opts->ignore_empty && data_size == 0 )
{ add_error( li, empty_msg ); li->retval = 2; return false; }
*pos = ipos + i - member_size; /* good member */
const unsigned dictionary_size = Lh_get_dictionary_size( header );
if( li->dictionary_size < dictionary_size )
li->dictionary_size = dictionary_size;
return push_back_member( li, 0, data_size, *pos, member_size,
dictionary_size );
return push_back_member( li, 0, Lt_get_data_size( *trailer ), *pos,
member_size, dictionary_size );
}
if( ipos == 0 )
{ Li_set_num_error( li, "Bad trailer at pos ", *pos - Lt_size );
@ -200,8 +191,8 @@ static bool Li_skip_trailing_data( struct Lzip_index * const li, const int fd,
}
bool Li_init( struct Lzip_index * const li, const int infd,
const struct Cl_options * const cl_opts )
bool Li_init( Lzip_index * const li, const int infd,
const Cl_options * const cl_opts )
{
li->member_vector = 0;
li->error = 0;
@ -212,6 +203,10 @@ bool Li_init( struct Lzip_index * const li, const int infd,
li->dictionary_size = 0;
if( li->insize < 0 )
{ Li_set_errno_error( li, "Input file is not seekable: " ); return false; }
Lzip_header header;
if( li->insize >= Lh_size &&
( !Li_read_header( li, infd, header, 0 ) ||
!Li_check_header( li, header ) ) ) return false;
if( li->insize < min_member_size )
{ add_error( li, "Input file is too short." ); li->retval = 2;
return false; }
@ -219,10 +214,6 @@ bool Li_init( struct Lzip_index * const li, const int infd,
{ add_error( li, "Input file is too long (2^63 bytes or more)." );
li->retval = 2; return false; }
Lzip_header header;
if( !Li_read_header( li, infd, header, 0, cl_opts->ignore_marking ) ||
!Li_check_header( li, header ) ) return false;
unsigned long long pos = li->insize; /* always points to a header or to EOF */
while( pos >= min_member_size )
{
@ -237,8 +228,7 @@ bool Li_init( struct Lzip_index * const li, const int infd,
return false; }
Li_set_num_error( li, "Bad trailer at pos ", pos - Lt_size ); break;
}
if( !Li_read_header( li, infd, header, pos - member_size,
cl_opts->ignore_marking ) ) break;
if( !Li_read_header( li, infd, header, pos - member_size ) ) break;
if( !Lh_check( header ) ) /* bad header */
{
if( li->members <= 0 )
@ -246,15 +236,12 @@ bool Li_init( struct Lzip_index * const li, const int infd,
return false; }
Li_set_num_error( li, "Bad header at pos ", pos - member_size ); break;
}
const unsigned long long data_size = Lt_get_data_size( trailer );
if( !cl_opts->ignore_empty && data_size == 0 )
{ add_error( li, empty_msg ); li->retval = 2; break; }
pos -= member_size; /* good member */
const unsigned dictionary_size = Lh_get_dictionary_size( header );
if( li->dictionary_size < dictionary_size )
li->dictionary_size = dictionary_size;
if( !push_back_member( li, 0, data_size, pos, member_size,
dictionary_size ) ) return false;
if( !push_back_member( li, 0, Lt_get_data_size( trailer ), pos,
member_size, dictionary_size ) ) return false;
}
if( pos != 0 || li->members <= 0 || li->retval != 0 )
{
@ -264,8 +251,7 @@ bool Li_init( struct Lzip_index * const li, const int infd,
return false;
}
Li_reverse_member_vector( li );
long i;
for( i = 0; ; ++i )
long i; for( i = 0; ; ++i )
{
const long long end = block_end( li->member_vector[i].dblock );
if( end < 0 || end > INT64_MAX )
@ -281,7 +267,7 @@ bool Li_init( struct Lzip_index * const li, const int infd,
}
void Li_free( struct Lzip_index * const li )
void Li_free( Lzip_index * const li )
{
Li_free_member_vector( li );
if( li->error ) { free( li->error ); li->error = 0; }