From cd8fd58633eaeabf59d674939c9784c46506cd5b Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Fri, 16 May 2014 19:42:26 +0800 Subject: [PATCH] araw: filter out non-finite floating point samples The input is not neessarily trusted. Better safe than sorry. --- modules/codec/Makefile.am | 1 + modules/codec/araw.c | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am index 218bc3ce9e..a90ecca31a 100644 --- a/modules/codec/Makefile.am +++ b/modules/codec/Makefile.am @@ -24,6 +24,7 @@ libaes3_plugin_la_SOURCES = codec/aes3.c codec_LTLIBRARIES += libaes3_plugin.la libaraw_plugin_la_SOURCES = codec/araw.c +libaraw_plugin_la_LIBADD = $(LIBM) codec_LTLIBRARIES += libaraw_plugin.la libdts_plugin_la_SOURCES = codec/dts.c codec/dts_header.c codec/dts_header.h diff --git a/modules/codec/araw.c b/modules/codec/araw.c index 0ec77d8fbe..a4b0f115e9 100644 --- a/modules/codec/araw.c +++ b/modules/codec/araw.c @@ -28,6 +28,7 @@ # include "config.h" #endif +#include #include #include @@ -96,7 +97,9 @@ static void S24L32Decode( void *, const uint8_t *, unsigned ); static void U32BDecode( void *, const uint8_t *, unsigned ); static void U32LDecode( void *, const uint8_t *, unsigned ); static void S32IDecode( void *, const uint8_t *, unsigned ); +static void F32NDecode( void *, const uint8_t *, unsigned ); static void F32IDecode( void *, const uint8_t *, unsigned ); +static void F64NDecode( void *, const uint8_t *, unsigned ); static void F64IDecode( void *, const uint8_t *, unsigned ); static void DAT12Decode( void *, const uint8_t *, unsigned ); @@ -139,7 +142,10 @@ static int DecoderOpen( vlc_object_t *p_this ) #endif format = VLC_CODEC_FL64; decode = F64IDecode; + bits = 64; + break; case VLC_CODEC_FL64: + decode = F64NDecode; bits = 64; break; #ifdef WORDS_BIGENDIAN @@ -149,7 +155,10 @@ static int DecoderOpen( vlc_object_t *p_this ) #endif format = VLC_CODEC_FL32; decode = F32IDecode; + bits = 32; + break; case VLC_CODEC_FL32: + decode = F32NDecode; bits = 32; break; case VLC_CODEC_U32B: @@ -506,6 +515,20 @@ static void S32IDecode( void *outp, const uint8_t *in, unsigned samples ) } } +static void F32NDecode( void *outp, const uint8_t *in, unsigned samples ) +{ + float *out = outp; + + for( size_t i = 0; i < samples; i++ ) + { + memcpy( out, in, sizeof(float) ); + if( unlikely(!isfinite(*out)) ) + *out = 0.f; + out++; + in += sizeof(float); + } +} + static void F32IDecode( void *outp, const uint8_t *in, unsigned samples ) { float *out = outp; @@ -519,11 +542,27 @@ static void F32IDecode( void *outp, const uint8_t *in, unsigned samples ) #else s.u = GetDWBE( in ); #endif + if( unlikely(!isfinite(s.f)) ) + s.f = 0.f; *(out++) = s.f; in += 4; } } +static void F64NDecode( void *outp, const uint8_t *in, unsigned samples ) +{ + double *out = outp; + + for( size_t i = 0; i < samples; i++ ) + { + memcpy( out, in, sizeof(double) ); + if( unlikely(!isfinite( *out )) ) + *out = 0.; + out++; + in += sizeof(double); + } +} + static void F64IDecode( void *outp, const uint8_t *in, unsigned samples ) { double *out = outp; @@ -537,6 +576,8 @@ static void F64IDecode( void *outp, const uint8_t *in, unsigned samples ) #else s.u = GetQWBE( in ); #endif + if( unlikely(!isfinite( s.d )) ) + s.d = 0.; *(out++) = s.d; in += 8; } -- 2.20.1