[Swfdec-commits] 2 commits - swfdec/swfdec_as_interpret.c swfdec/swfdec_net_stream_as.c

Benjamin Otte company at kemper.freedesktop.org
Sun Jan 27 10:22:51 PST 2008


 swfdec/swfdec_as_interpret.c  |   52 ++++++++++++++++--------------------------
 swfdec/swfdec_net_stream_as.c |    8 +++++-
 2 files changed, 27 insertions(+), 33 deletions(-)

New commits:
commit ac9839a28e7c57323b5253af64452d01c4c1f918
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Jan 27 19:22:43 2008 +0100

    unset sandbox prior to seeking, as seeking can emit onStatus (fixes #13739)
    
    note: onStatus should not be able to emit onStatus as seeking is delayed, so
    Swfdec code is wrong. But I'm not sure how this code is supposed to work yet...

diff --git a/swfdec/swfdec_net_stream_as.c b/swfdec/swfdec_net_stream_as.c
index 1dce4ba..93b889a 100644
--- a/swfdec/swfdec_net_stream_as.c
+++ b/swfdec/swfdec_net_stream_as.c
@@ -23,12 +23,13 @@
 
 #include "swfdec_net_stream.h"
 #include "swfdec_as_context.h"
+#include "swfdec_as_internal.h"
 #include "swfdec_as_native_function.h"
 #include "swfdec_as_strings.h"
 #include "swfdec_debug.h"
 #include "swfdec_internal.h"
-#include "swfdec_as_internal.h"
 #include "swfdec_player_internal.h"
+#include "swfdec_sandbox.h"
 
 SWFDEC_AS_NATIVE (2101, 0, swfdec_net_stream_close)
 void
@@ -128,10 +129,15 @@ static void
 swfdec_net_stream_do_seek (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
   SwfdecNetStream *stream = SWFDEC_NET_STREAM (obj);
+  SwfdecSandbox *cur;
   double d;
 
   d = swfdec_as_value_to_number (cx, &argv[0]);
+  cur = SWFDEC_SANDBOX (cx->global);
+  swfdec_sandbox_unuse (cur);
+  /* FIXME: perform security check if seeking is allowed here? */
   swfdec_net_stream_seek (stream, d);
+  swfdec_sandbox_use (cur);
 }
 
 static void
commit 878619a51a43d1605d157e0d46be370639a03eef
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jan 26 03:07:06 2008 +0100

    add simple implementation of WaitForFrame2

diff --git a/swfdec/swfdec_as_interpret.c b/swfdec/swfdec_as_interpret.c
index 813c1ce..9af7700 100644
--- a/swfdec/swfdec_as_interpret.c
+++ b/swfdec/swfdec_as_interpret.c
@@ -233,40 +233,32 @@ swfdec_script_skip_actions (SwfdecAsContext *cx, guint jump)
   cx->frame->pc = pc;
 }
 
-#if 0
 static void
 swfdec_action_wait_for_frame2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
 {
-  jsval val;
+  SwfdecSpriteMovie *movie;
+  guint jump;
+  int frame, loaded;
 
-  if (len != 1) {
+  if (len < 1) {
     SWFDEC_ERROR ("WaitForFrame2 needs a 1-byte data");
-    return JS_FALSE;
+    return;
   }
-  val = cx->fp->sp[-1];
-  cx->fp->sp--;
-  if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) {
-    SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target);
-    int frame = swfdec_value_to_frame (cx, movie, val);
-    guint jump = data[2];
-    guint loaded;
-    if (frame < 0)
-      return JS_TRUE;
-    if (SWFDEC_IS_ROOT_MOVIE (movie)) {
-      SwfdecDecoder *dec = SWFDEC_ROOT_MOVIE (movie)->decoder;
-      loaded = dec->frames_loaded;
-      g_assert (loaded <= movie->n_frames);
-    } else {
-      loaded = movie->n_frames;
-    }
-    if (loaded <= (guint) frame)
-      swfdec_script_skip_actions (cx, jump);
-  } else {
-    SWFDEC_ERROR ("no movie to WaitForFrame2 on");
+  if (!SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) {
+    SWFDEC_ERROR ("no movie for WaitForFrame");
+    return;
   }
-  return JS_TRUE;
+
+  movie = SWFDEC_SPRITE_MOVIE (cx->frame->target);
+  frame = swfdec_value_to_frame (cx, movie, swfdec_as_stack_pop (cx));
+  if (frame == 0) {
+    SWFDEC_FIXME ("wait for invalid frames or not?");
+  }
+  loaded = swfdec_sprite_movie_get_frames_loaded (movie);
+  if (loaded < (int) movie->n_frames &&
+      loaded <= frame)
+    swfdec_script_skip_actions (cx, jump);
 }
-#endif
 
 static void
 swfdec_action_wait_for_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
@@ -3066,17 +3058,15 @@ swfdec_action_print_constant_pool (guint action, const guint8 *data, guint len)
   return g_string_free (string, FALSE);
 }
 
-#if 0
 static char *
 swfdec_action_print_wait_for_frame2 (guint action, const guint8 *data, guint len)
 {
-  if (len != 1) {
+  if (len < 1) {
     SWFDEC_ERROR ("WaitForFrame2 needs a 1-byte data");
     return NULL;
   }
   return g_strdup_printf ("WaitForFrame2 %u", (guint) *data);
 }
-#endif
 
 static char *
 swfdec_action_print_goto_frame2 (guint action, const guint8 *data, guint len)
@@ -3245,10 +3235,8 @@ const SwfdecActionSpec swfdec_as_actions[256] = {
   [SWFDEC_AS_ACTION_SET_TARGET] = { "SetTarget", swfdec_action_print_set_target, 0, 0, swfdec_action_set_target, 1 },
   /* version 3 */
   [SWFDEC_AS_ACTION_GOTO_LABEL] = { "GotoLabel", swfdec_action_print_goto_label, 0, 0, swfdec_action_goto_label, 3 },
-#if 0
   /* version 4 */
-  [0x8d] = { "WaitForFrame2", swfdec_action_print_wait_for_frame2, 1, 0, { NULL, swfdec_action_wait_for_frame2, swfdec_action_wait_for_frame2, swfdec_action_wait_for_frame2, swfdec_action_wait_for_frame2 } },
-#endif
+  [SWFDEC_AS_ACTION_WAIT_FOR_FRAME2] = { "WaitForFrame2", swfdec_action_print_wait_for_frame2, 1, 0, swfdec_action_wait_for_frame2, 4 },
   /* version 7 */
   [SWFDEC_AS_ACTION_DEFINE_FUNCTION2] = { "DefineFunction2", swfdec_action_print_define_function, 0, -1, swfdec_action_define_function, 7 },
   [SWFDEC_AS_ACTION_TRY] = { "Try", NULL, 0, 0, swfdec_action_try, 7 },


More information about the Swfdec-commits mailing list