/*****************************************************************************
* wav.c : wav file input module for vlc
*****************************************************************************
- * Copyright (C) 2001-2007 the VideoLAN team
+ * Copyright (C) 2001-2008 the VideoLAN team
* $Id$
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
demux_sys_t *p_sys;
const uint8_t *p_peek;
- unsigned int i_size, i_extended;
+ uint32_t i_size;
+ unsigned int i_extended;
const char *psz_name;
WAVEFORMATEXTENSIBLE *p_wf_ext = NULL;
msg_Err( p_demux, "cannot find 'fmt ' chunk" );
goto error;
}
- if( i_size < sizeof( WAVEFORMATEX ) - 2 ) /* XXX -2 isn't a typo */
+ i_size += 2;
+ if( i_size < sizeof( WAVEFORMATEX ) )
{
msg_Err( p_demux, "invalid 'fmt ' chunk" );
goto error;
stream_Read( p_demux->s, NULL, 8 ); /* Cannot fail */
/* load waveformatex */
- p_wf_ext = malloc( __EVEN( i_size ) + 2 );
+ p_wf_ext = malloc( i_size );
if( p_wf_ext == NULL )
goto error;
p_wf = (WAVEFORMATEX *)p_wf_ext;
p_wf->cbSize = 0;
- if( stream_Read( p_demux->s,
- p_wf, __EVEN( i_size ) ) < (int)__EVEN( i_size ) )
+ i_size -= 2;
+ if( stream_Read( p_demux->s, p_wf, i_size ) != (int)i_size
+ || ( ( i_size & 1 ) && stream_Read( p_demux->s, NULL, 1 ) != 1 ) )
{
msg_Err( p_demux, "cannot load 'fmt ' chunk" );
goto error;
for( ;; )
{
- int i_size;
+ uint32_t i_size;
if( stream_Peek( p_demux->s, &p_peek, 8 ) < 8 )
{
- msg_Err( p_demux, "cannot peek()" );
+ msg_Err( p_demux, "cannot peek" );
return VLC_EGENERIC;
}
i_size = GetDWLE( p_peek + 4 );
- msg_Dbg( p_demux, "chunk: fcc=`%4.4s` size=%d", p_peek, i_size );
+ msg_Dbg( p_demux, "chunk: fcc=`%4.4s` size=%"PRIu32, p_peek, i_size );
if( !memcmp( p_peek, fcc, 4 ) )
{
return VLC_SUCCESS;
}
- i_size = __EVEN( i_size ) + 8;
- if( stream_Read( p_demux->s, NULL, i_size ) != i_size )
- {
+ /* Skip chunk */
+ if( stream_Read( p_demux->s, NULL, 8 ) != 8
+ || stream_Read( p_demux->s, NULL, i_size ) != i_size
+ || ((i_size & 1) && stream_Read( p_demux->s, NULL, 1 ) != 1 ))
return VLC_EGENERIC;
- }
}
}