From: Henrik Gramner Date: Tue, 23 Jun 2015 20:08:35 +0000 (+0200) Subject: slurp_file: Various minor bug fixes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=936e8da1a4f9d0431b181d0877bb1602d4de9441;p=libx264 slurp_file: Various minor bug fixes * Fix unsigned <= 0 check. * Add additional size sanity check on 32-bit systems. * Don't read uninitialized data if fread() fails. --- diff --git a/common/common.c b/common/common.c index 5559d677..28eec1f8 100644 --- a/common/common.c +++ b/common/common.c @@ -1274,29 +1274,36 @@ REDUCE_FRACTION( x264_reduce_fraction64, uint64_t ) char *x264_slurp_file( const char *filename ) { int b_error = 0; - size_t i_size; + int64_t i_size; char *buf; FILE *fh = x264_fopen( filename, "rb" ); if( !fh ) return NULL; + b_error |= fseek( fh, 0, SEEK_END ) < 0; b_error |= ( i_size = ftell( fh ) ) <= 0; + if( WORD_SIZE == 4 ) + b_error |= i_size > INT32_MAX; b_error |= fseek( fh, 0, SEEK_SET ) < 0; if( b_error ) goto error; + buf = x264_malloc( i_size+2 ); if( !buf ) goto error; + b_error |= fread( buf, 1, i_size, fh ) != i_size; - if( buf[i_size-1] != '\n' ) - buf[i_size++] = '\n'; - buf[i_size] = 0; fclose( fh ); if( b_error ) { x264_free( buf ); return NULL; } + + if( buf[i_size-1] != '\n' ) + buf[i_size++] = '\n'; + buf[i_size] = '\0'; + return buf; error: fclose( fh );