gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/swf_event.h server/swf/P...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/swf_event.h server/swf/P...
Date: Tue, 11 Dec 2007 15:33:11 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/12/11 15:33:11

Modified files:
        .              : ChangeLog 
        server         : swf_event.h 
        server/swf     : PlaceObject2Tag.cpp PlaceObject2Tag.h 

Log message:
        Allow for same action_buffer to be referenced by multiple swf_events 
(ie:
        triggered by multiple clip events). This fixes security bugs when 
multiple
        events are listed for a PlaceObject action. Note that we have no 
automated
        test for this. There are a lot of testcases which may host this 
additional
        one, but I'm not sure we want to squat or make a new one. Zou ?

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5132&r2=1.5133
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf_event.h?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/PlaceObject2Tag.cpp?cvsroot=gnash&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/PlaceObject2Tag.h?cvsroot=gnash&r1=1.14&r2=1.15

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5132
retrieving revision 1.5133
diff -u -b -r1.5132 -r1.5133
--- ChangeLog   11 Dec 2007 15:13:27 -0000      1.5132
+++ ChangeLog   11 Dec 2007 15:33:10 -0000      1.5133
@@ -1,5 +1,13 @@
 2007-12-11 Sandro Santilli <address@hidden>
 
+       * server/swf_event.h: leave ownership of action_buffer to the 
+         caller as a single action buffer can be triggered by multiple
+         system events.
+       * server/swf/PlaceObject2Tag.{cpp,h}: keep ownership of event
+         action buffers, split PlaceObject2 and PlaceObject3 parser.
+
+2007-12-11 Sandro Santilli <address@hidden>
+
        * server/swf/DisplayListTag.h: streamline included headers and
          forward declarations.
        * server/impl.cpp (create_jpeg_movie): fix log message format.

Index: server/swf_event.h
===================================================================
RCS file: /sources/gnash/gnash/server/swf_event.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/swf_event.h  30 Oct 2007 18:55:43 -0000      1.8
+++ server/swf_event.h  11 Dec 2007 15:33:10 -0000      1.9
@@ -1,3 +1,4 @@
+// swf_event.h -- clip events (PlaceObject-defined)
 // 
 //   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
 // 
@@ -42,20 +43,23 @@
 {
 public:
 
-       swf_event(const event_id& ev, std::auto_ptr<action_buffer> buf)
+       swf_event(const event_id& ev, action_buffer& buf)
                :
                m_event(ev),
                m_action_buffer(buf)
        {
        }
 
-       swf_event()
+       swf_event(const swf_event& o)
+               :
+               m_event(o.m_event),
+               m_action_buffer(o.m_action_buffer)
        {
        }
 
        const action_buffer& action()
        {
-               return *m_action_buffer;
+               return m_action_buffer;
        }
 
        event_id& event()
@@ -65,15 +69,18 @@
 
 private:
 
-    // NOTE: DO NOT USE THESE AS VALUE TYPES IN AN
-    // std::vector<>!  They cannot be moved!  The private
-    // operator=(const swf_event&) should help guard
-    // against that.
-
+       /// System event id
     event_id   m_event;
-    std::auto_ptr<action_buffer> m_action_buffer;
-    // DON'T USE THESE
-    swf_event(const swf_event& /*s*/) { abort(); }
+
+       /// Action buffer associated with this event
+       //
+       /// The buffer is externally owned
+       /// (by PlaceObject tag in this design)
+       /// and may be shared between multiple swf_events
+       ///
+       action_buffer& m_action_buffer;
+
+       /// Can't assign to an swf_event
     void       operator=(const swf_event& /*s*/) { abort(); }
 };
 

Index: server/swf/PlaceObject2Tag.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/PlaceObject2Tag.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- server/swf/PlaceObject2Tag.cpp      4 Dec 2007 11:45:33 -0000       1.24
+++ server/swf/PlaceObject2Tag.cpp      11 Dec 2007 15:33:10 -0000      1.25
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: PlaceObject2Tag.cpp,v 1.24 2007/12/04 11:45:33 strk Exp $ */
+/* $Id: PlaceObject2Tag.cpp,v 1.25 2007/12/11 15:33:10 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -117,7 +117,8 @@
                }
 
                // Read the actions for event(s)
-               std::auto_ptr<action_buffer> action(new action_buffer);
+               action_buffer* action = new action_buffer();
+               _actionBuffers.push_back(action); // take ownership
                action->read(in);
 
                size_t readlen = action->size();
@@ -191,12 +192,15 @@
                        );
                }
 
+               // Aah! same action for multiple events !
                for (int i = 0, mask = 1; i < total_known_events; i++, mask <<= 
1)
                {
                        if (flags & mask)
                        {
-                               std::auto_ptr<swf_event> ev ( new 
swf_event(s_code_bits[i], action) );
-                               //log_action("---- actions for event %s", 
ev->event().get_function_name().c_str());
+                               std::auto_ptr<swf_event> ev ( new 
swf_event(s_code_bits[i], *action) );
+                               IF_VERBOSE_PARSE (
+                               log_parse("---- actions for event %s", 
ev->event().get_function_name().c_str());
+                               );
 
                                if (i == 17)    // has KeyPress event
                                {
@@ -211,7 +215,97 @@
 
 // read SWF::PLACEOBJECT2
 void
-PlaceObject2Tag::readPlaceObject2(stream* in, int movie_version, bool place_2)
+PlaceObject2Tag::readPlaceObject2(stream* in, int movie_version)
+{
+       in->align();
+
+       bool    has_actions = in->read_bit(); 
+       bool    has_clip_bracket = in->read_bit(); 
+       bool    has_name = in->read_bit();
+       bool    has_ratio = in->read_bit();
+       bool    has_cxform = in->read_bit();
+       bool    has_matrix = in->read_bit(); 
+       bool    has_char = in->read_bit(); 
+       bool    flag_move = in->read_bit(); 
+
+       m_depth = in->read_u16()+character::staticDepthOffset;
+
+       if (has_char) m_character_id = in->read_u16();
+
+       if (has_matrix)
+       {
+               m_has_matrix = true;
+               m_matrix.read(in);
+       }
+
+       if (has_cxform)
+       {
+               m_has_cxform = true;
+               m_color_transform.read_rgba(in);
+       }
+
+       if (has_ratio) 
+               m_ratio = in->read_u16();
+       else
+               m_ratio = character::noRatioValue;
+
+       if (has_name) m_name = in->read_string();
+
+       if (has_clip_bracket)
+               m_clip_depth = in->read_u16()+character::staticDepthOffset;
+       else
+               m_clip_depth = character::noClipDepthValue;
+
+       if (has_actions)
+       {
+               readPlaceActions(in, movie_version);
+       }
+
+       if (has_char == true && flag_move == true)
+       {
+               // Remove whatever's at m_depth, and put m_character there.
+               m_place_type = REPLACE;
+       }
+       else if (has_char == false && flag_move == true)
+       {
+               // Moves the object at m_depth to the new location.
+               m_place_type = MOVE;
+       }
+       else if (has_char == true && flag_move == false)
+       {
+               // Put m_character at m_depth.
+               m_place_type = PLACE;
+       }
+        else if (has_char == false && flag_move == false)
+        {
+             m_place_type = REMOVE;
+        }
+
+       IF_VERBOSE_PARSE (
+               log_parse(_("  PLACEOBJECT2: depth = %d (%d)"), m_depth, 
m_depth-character::staticDepthOffset);
+               if ( has_char ) log_parse(_("  char id = %d"), m_character_id);
+               if ( has_matrix )
+               {
+                       log_parse(_("  mat:"));
+                       m_matrix.print();
+               }
+               if ( has_cxform )
+               {
+                       log_parse(_("  cxform:"));
+                       m_color_transform.print();
+               }
+               if ( has_ratio ) log_parse(_("  ratio: %d"), m_ratio);
+               if ( has_name ) log_parse(_("  name = %s"), m_name ? m_name : 
"<null>");
+               if ( has_clip_bracket ) log_parse(_("  clip_depth = %d (%d)"), 
m_clip_depth, m_clip_depth-character::staticDepthOffset);
+               log_parse(_(" m_place_type: %d"), m_place_type);
+       );
+
+       //log_msg("place object at depth %i", m_depth);
+}
+
+// read SWF::PLACEOBJECT4
+void
+PlaceObject2Tag::readPlaceObject3(stream* in, int movie_version)
 {
        in->align();
 
@@ -220,6 +314,7 @@
         bool has_bitmap_caching = false;
         bool has_blend_mode = false;
         bool has_filters = false;
+       std::string className;
 
        bool    has_actions = in->read_bit(); 
        bool    has_clip_bracket = in->read_bit(); 
@@ -230,17 +325,26 @@
        bool    has_char = in->read_bit(); 
        bool    flag_move = in->read_bit(); 
 
-        if (!place_2 && movie_version >= 8)
-        {
-            in->read_uint(5); // Ignore on purpose.
+       in->align();
+        in->read_uint(3); // Ignore on purpose.
+       bool    hasImage = in->read_bit();
+       bool    hasClassName = in->read_bit();
             has_bitmap_caching = in->read_bit(); 
             has_blend_mode = in->read_bit(); 
             has_filters = in->read_bit(); 
-        }
 
        m_depth = in->read_u16()+character::staticDepthOffset;
 
-       if (has_char) m_character_id = in->read_u16();
+       if (has_char)
+       {
+               m_character_id = in->read_u16();
+       }
+
+       if (hasClassName || (hasImage && has_char) )
+       {
+               log_unimpl("PLACEOBJECT3 with associated class name");
+               in->read_string(className);
+       }
 
        if (has_matrix)
        {
@@ -310,7 +414,7 @@
         }
 
        IF_VERBOSE_PARSE (
-               log_parse(_("  PLACEOBJECT2: depth = %d (%d)"), m_depth, 
m_depth-character::staticDepthOffset);
+               log_parse(_("  PLACEOBJECT3: depth = %d (%d)"), m_depth, 
m_depth-character::staticDepthOffset);
                if ( has_char ) log_parse(_("  char id = %d"), m_character_id);
                if ( has_matrix )
                {
@@ -324,6 +428,7 @@
                }
                if ( has_ratio ) log_parse(_("  ratio: %d"), m_ratio);
                if ( has_name ) log_parse(_("  name = %s"), m_name ? m_name : 
"<null>");
+               if ( hasClassName ) log_parse(_("  class name = %s"), 
className.c_str());
                if ( has_clip_bracket ) log_parse(_("  clip_depth = %d (%d)"), 
m_clip_depth, m_clip_depth-character::staticDepthOffset);
                log_parse(_(" m_place_type: %d"), m_place_type);
        );
@@ -341,9 +446,13 @@
        {
                readPlaceObject(in);
        }
+       else if ( tag == SWF::PLACEOBJECT2 )
+       {
+               readPlaceObject2(in, movie_version);
+       }
        else
        {
-               readPlaceObject2(in, movie_version, tag == SWF::PLACEOBJECT3 ? 
false : true);
+               readPlaceObject3(in, movie_version);
        }
 }
 
@@ -393,11 +502,18 @@
 PlaceObject2Tag::~PlaceObject2Tag()
 {
        delete [] m_name;
+
        m_name = NULL;
+
        for(size_t i=0; i<m_event_handlers.size(); ++i)
        {
                delete m_event_handlers[i];
        }
+
+       for(size_t i=0; i<_actionBuffers.size(); ++i)
+       {
+               delete _actionBuffers[i];
+       }
 }
 
 /* public static */

Index: server/swf/PlaceObject2Tag.h
===================================================================
RCS file: /sources/gnash/gnash/server/swf/PlaceObject2Tag.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- server/swf/PlaceObject2Tag.h        4 Dec 2007 11:45:33 -0000       1.14
+++ server/swf/PlaceObject2Tag.h        11 Dec 2007 15:33:10 -0000      1.15
@@ -19,7 +19,7 @@
 //
 //
 
-/* $Id: PlaceObject2Tag.h,v 1.14 2007/12/04 11:45:33 strk Exp $ */
+/* $Id: PlaceObject2Tag.h,v 1.15 2007/12/11 15:33:10 strk Exp $ */
 
 #ifndef GNASH_SWF_PLACEOBJECT2TAG_H
 #define GNASH_SWF_PLACEOBJECT2TAG_H
@@ -40,6 +40,7 @@
        class stream;
        class sprite_instance;
        class swf_event;
+       class action_buffer;
        class movie_definition;
 }
 
@@ -61,6 +62,7 @@
 {
 public:
 
+       typedef std::vector<action_buffer*> ActionBuffers;
        typedef std::vector<swf_event*> EventHandlers;
 
        PlaceObject2Tag(const movie_definition& def)
@@ -126,6 +128,8 @@
 
        const movie_definition& _movie_def;
 
+       ActionBuffers _actionBuffers;
+
        EventHandlers m_event_handlers;
 
        // read SWF::PLACEOBJECT 
@@ -134,8 +138,11 @@
        // read placeObject2 actions
        void readPlaceActions(stream* in, int movie_version);
 
-       // read SWF::PLACEOBJECT2 or SWF::PLACEOBJECT3
-       void readPlaceObject2(stream* in, int movie_version, bool place_2);
+       // read SWF::PLACEOBJECT2 
+       void readPlaceObject2(stream* in, int movie_version);
+
+       // read SWF::PLACEOBJECT3
+       void readPlaceObject3(stream* in, int movie_version);
 
 };
 




reply via email to

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