From e40e8b33a1e925c7f9db57bedac4014f57481232 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sun, 13 Sep 2015 08:05:50 +0200 Subject: [PATCH] [gzip] Fix access of small compressed files (#45937). * src/gzip/ftgzip.c (ft_gzip_stream_close): Avoid memory leak. (ft_gzip_get_uncompressed_file): Correct byte order while reading unsigned long value. Without this change, the whole optimization of accessing small files in `FT_Stream_OpenGzip' is never executed! As a consequence, access to PCF files in general (which are normally small files) should be much improved now as originally intended. --- ChangeLog | 12 ++++++++++++ src/gzip/ftgzip.c | 7 +++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index c1853805a..3618f2489 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2015-09-13 Werner Lemberg + + [gzip] Fix access of small compressed files (#45937). + + * src/gzip/ftgzip.c (ft_gzip_stream_close): Avoid memory leak. + + (ft_gzip_get_uncompressed_file): Correct byte order while reading + unsigned long value. Without this change, the whole optimization of + accessing small files in `FT_Stream_OpenGzip' is never executed! As + a consequence, access to PCF files in general (which are normally + small files) should be much improved now as originally intended. + 2015-09-11 Werner Lemberg [psaux] Fix potential buffer overflow (#45922). diff --git a/src/gzip/ftgzip.c b/src/gzip/ftgzip.c index 879eb88a7..be9c122a2 100644 --- a/src/gzip/ftgzip.c +++ b/src/gzip/ftgzip.c @@ -557,6 +557,9 @@ stream->descriptor.pointer = NULL; } + + if ( !stream->read ) + FT_FREE( stream->base ); } @@ -584,7 +587,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; @@ -685,7 +688,7 @@ 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;