diff options
Diffstat (limited to 'src/gzip/ftgzip.c')
-rw-r--r-- | src/gzip/ftgzip.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/gzip/ftgzip.c b/src/gzip/ftgzip.c index 879eb88..27c6254 100644 --- a/src/gzip/ftgzip.c +++ b/src/gzip/ftgzip.c @@ -377,7 +377,10 @@ size = stream->read( stream, stream->pos, zip->input, FT_GZIP_BUFFER_SIZE ); if ( size == 0 ) + { + zip->limit = zip->cursor; return FT_THROW( Invalid_Stream_Operation ); + } } else { @@ -386,7 +389,10 @@ size = FT_GZIP_BUFFER_SIZE; if ( size == 0 ) + { + zip->limit = zip->cursor; return FT_THROW( Invalid_Stream_Operation ); + } FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); } @@ -433,7 +439,8 @@ } else if ( err != Z_OK ) { - error = FT_THROW( Invalid_Stream_Operation ); + zip->limit = zip->cursor; + error = FT_THROW( Invalid_Stream_Operation ); break; } } @@ -557,19 +564,22 @@ stream->descriptor.pointer = NULL; } + + if ( !stream->read ) + FT_FREE( stream->base ); } - static FT_ULong - ft_gzip_stream_io( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) + static unsigned long + ft_gzip_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) { FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; - return ft_gzip_file_io( zip, pos, buffer, count ); + return ft_gzip_file_io( zip, offset, buffer, count ); } @@ -584,7 +594,7 @@ old_pos = stream->pos; if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) { - result = FT_Stream_ReadULong( stream, &error ); + result = FT_Stream_ReadULongLE( stream, &error ); if ( error ) result = 0; @@ -681,11 +691,15 @@ } error = FT_Err_Ok; } + + if ( zip_size ) + stream->size = zip_size; + else + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ } - stream->size = 0x7FFFFFFFL; /* don't know the real size! */ stream->pos = 0; - stream->base = 0; + stream->base = NULL; stream->read = ft_gzip_stream_io; stream->close = ft_gzip_stream_close; |