vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon Aug 31 19:59:22 2015 +0300| [b4b8a826398d53328f6d7d4e2630e52f8a0657a1] | committer: Rémi Denis-Courmont
stream: fix integer overflow with stream_Block() > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b4b8a826398d53328f6d7d4e2630e52f8a0657a1 --- include/vlc_stream.h | 2 +- src/input/stream.c | 38 ++++++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/include/vlc_stream.h b/include/vlc_stream.h index 289f311..30fde50 100644 --- a/include/vlc_stream.h +++ b/include/vlc_stream.h @@ -114,7 +114,7 @@ VLC_API ssize_t stream_Peek(stream_t *, const uint8_t **, size_t); VLC_API int stream_vaControl( stream_t *s, int i_query, va_list args ); VLC_API void stream_Delete( stream_t *s ); VLC_API int stream_Control( stream_t *s, int i_query, ... ); -VLC_API block_t * stream_Block( stream_t *s, int i_size ); +VLC_API block_t * stream_Block( stream_t *s, size_t ); VLC_API char * stream_ReadLine( stream_t * ); VLC_API input_item_t *stream_ReadDir( stream_t * ); diff --git a/src/input/stream.c b/src/input/stream.c index d0e2bf5..ea0eeb9 100644 --- a/src/input/stream.c +++ b/src/input/stream.c @@ -29,6 +29,7 @@ #include <assert.h> #include <stdlib.h> #include <string.h> +#include <limits.h> #include <vlc_common.h> #include <vlc_block.h> @@ -539,27 +540,32 @@ int stream_Control( stream_t *s, int i_query, ... ) } /** - * Read "i_size" bytes and store them in a block_t. - * It always read i_size bytes unless you are at the end of the stream - * where it return what is available. + * Read data into a block. + * + * @param s stream to read data from + * @param size number of bytes to read + * @return a block of data, or NULL on error + @ note The block size may be shorter than requested if the end-of-stream was + * reached. */ -block_t *stream_Block( stream_t *s, int i_size ) +block_t *stream_Block( stream_t *s, size_t size ) { - if( i_size <= 0 ) return NULL; + if( unlikely(size > SSIZE_MAX) ) + return NULL; - /* emulate block read */ - block_t *p_bk = block_Alloc( i_size ); - if( p_bk ) + block_t *block = block_Alloc( size ); + if( unlikely(block == NULL) ) + return NULL; + + ssize_t val = stream_Read( s, block->p_buffer, size ); + if( val <= 0 ) { - int i_read = stream_Read( s, p_bk->p_buffer, i_size ); - if( i_read > 0 ) - { - p_bk->i_buffer = i_read; - return p_bk; - } - block_Release( p_bk ); + block_Release( block ); + return NULL; } - return NULL; + + block->i_buffer = val; + return block; } /** _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
