gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/swf/tag_loaders.cpp


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/swf/tag_loaders.cpp
Date: Thu, 10 Jan 2008 11:44:04 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/01/10 11:44:04

Modified files:
        .              : ChangeLog 
        server/swf     : tag_loaders.cpp 

Log message:
        (sound_stream_head_loader, define_sound_loader): check sample rate 
arguments.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5365&r2=1.5366
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&r1=1.176&r2=1.177

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5365
retrieving revision 1.5366
diff -u -b -r1.5365 -r1.5366
--- ChangeLog   10 Jan 2008 10:57:22 -0000      1.5365
+++ ChangeLog   10 Jan 2008 11:44:03 -0000      1.5366
@@ -1,5 +1,10 @@
 2008-01-10 Sandro Santilli <address@hidden>
 
+       * server/swf/tag_loaders.cpp (sound_stream_head_loader,
+         define_sound_loader): check sample rate arguments.
+
+2008-01-10 Sandro Santilli <address@hidden>
+
        * server/parser/movie_def_impl.{cpp,h}: make exported resource
          container access thread-safe, cleanup debug messages
          in get_export_resource().

Index: server/swf/tag_loaders.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v
retrieving revision 1.176
retrieving revision 1.177
diff -u -b -r1.176 -r1.177
--- server/swf/tag_loaders.cpp  10 Jan 2008 10:26:51 -0000      1.176
+++ server/swf/tag_loaders.cpp  10 Jan 2008 11:44:04 -0000      1.177
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: tag_loaders.cpp,v 1.176 2008/01/10 10:26:51 strk Exp $ */
+/* $Id: tag_loaders.cpp,v 1.177 2008/01/10 11:44:04 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -1159,8 +1159,19 @@
        bool sample_16bit, bool stereo, unsigned int &sample_count,
        unsigned char* &data, unsigned &data_bytes);
 */
+
 // Common data
+
+/// Sample rate table for DEFINESOUNDHEAD tags
+//
+/// The value found in the tag is encoded as 2 bits and
+/// represent a multiple of 5512.5.
+/// NOTE that the first element of this table lacks the .5
+/// portion of the actual value. Dunno what consequences 
+/// it could have...
+///
 static int     s_sample_rate_table[] = { 5512, 11025, 22050, 44100 };
+static unsigned int s_sample_rate_table_len = 4;
 
 // @@ There are two sets of code to decode/expand/byteswap audio here.
 // @@ There should be one (search for ADPCM).
@@ -1178,7 +1189,18 @@
        boost::uint16_t character_id = in->read_u16();
 
        media::audioCodecType   format = 
static_cast<media::audioCodecType>(in->read_uint(4));
-       int     sample_rate = in->read_uint(2); // multiples of 5512.5
+       unsigned sample_rate_in = in->read_uint(2); // see s_sample_rate_table
+    if ( sample_rate_in >= s_sample_rate_table_len ) 
+    {
+               IF_VERBOSE_MALFORMED_SWF(
+        log_swferror(_("DEFINESOUNDLOADER: sound sample rate %d (expected 0 to 
%u"), 
+            sample_rate_in, s_sample_rate_table_len);
+               );
+        sample_rate_in = 0;
+    }
+    int sample_rate = s_sample_rate_table[sample_rate_in];
+
+
        bool    sample_16bit = in->read_bit(); 
        bool    stereo = in->read_bit(); 
 
@@ -1216,14 +1238,6 @@
 
        if (handler)
        {
-           if (! (sample_rate >= 0 && sample_rate <= 3))
-           {
-               IF_VERBOSE_MALFORMED_SWF(
-                   log_swferror(_("Bad sound sample rate %d read from SWF 
header"), sample_rate);
-               );
-               return;
-           }
-
            // First it is the amount of data from file,
            // then the amount allocated at *data (it may grow)
            unsigned data_bytes = in->get_tag_end_position() - 
in->get_position();
@@ -1233,7 +1247,7 @@
 
            // Store all the data in a SoundInfo object
            std::auto_ptr<media::SoundInfo> sinfo;
-           sinfo.reset(new media::SoundInfo(format, stereo, 
s_sample_rate_table[sample_rate], sample_count, sample_16bit));
+           sinfo.reset(new media::SoundInfo(format, stereo, sample_rate, 
sample_count, sample_16bit));
 
            // Stores the sounddata in the soundhandler, and the ID returned
            // can be used to starting, stopping and deleting that sound
@@ -1280,13 +1294,32 @@
 
     // These are all unused by current implementation
     int reserved = in->read_uint(4); UNUSED(reserved);
-    int playbackSoundRate = in->read_uint(2);
+
+    unsigned int pbSoundRate = in->read_uint(2);
+    if ( pbSoundRate >= s_sample_rate_table_len )
+    {
+        IF_VERBOSE_MALFORMED_SWF(
+        log_swferror("SOUNDSTREAMHEAD: playback sound rate %d (expected 0 to 
%d)",
+            pbSoundRate, s_sample_rate_table_len);
+        );
+        pbSoundRate=0;
+    }
+    int playbackSoundRate = s_sample_rate_table[pbSoundRate];
     bool playbackSound16bit = in->read_bit();
     bool playbackSoundStereo = in->read_bit();
 
     // These are the used ones
     media::audioCodecType format = 
static_cast<media::audioCodecType>(in->read_uint(4)); // TODO: check input !
-    int streamSoundRate = in->read_uint(2);    // multiples of 5512.5
+    unsigned int stSoundRate = in->read_uint(2);
+    if ( stSoundRate >= s_sample_rate_table_len )
+    {
+        IF_VERBOSE_MALFORMED_SWF(
+        log_swferror(_("SOUNDSTREAMHEAD: stream sample rate %d (expected 0 to 
%u)"),
+            stSoundRate, s_sample_rate_table_len);
+        );
+        stSoundRate=0;
+    }
+    int streamSoundRate = s_sample_rate_table[stSoundRate];
     bool streamSound16bit = in->read_bit(); 
     bool streamSoundStereo = in->read_bit(); 
 
@@ -1342,18 +1375,9 @@
 
     // Wot about reading the sample_count samples?
 
-    if (! (streamSoundRate >= 0 && streamSoundRate <= 3))
-    {
-        IF_VERBOSE_MALFORMED_SWF(
-           log_swferror(_("Bad sound sample rate %d read from SWF header"),
-                        streamSoundRate);
-           );
-        return;
-    }
-
        // Store all the data in a SoundInfo object
        std::auto_ptr<media::SoundInfo> sinfo;
-       sinfo.reset(new media::SoundInfo(format, streamSoundStereo, 
s_sample_rate_table[streamSoundRate], sampleCount, streamSound16bit));
+       sinfo.reset(new media::SoundInfo(format, streamSoundStereo, 
streamSoundRate, sampleCount, streamSound16bit));
 
        // Stores the sounddata in the soundhandler, and the ID returned
        // can be used to starting, stopping and deleting that sound




reply via email to

[Prev in Thread] Current Thread [Next in Thread]