Benjamin Otte
2007-Sep-14 12:20 UTC
[Swfdec] 4 commits - libswfdec/swfdec_as_function.c libswfdec/swfdec_as_object.c test/trace
libswfdec/swfdec_as_function.c | 35 ++++++++++++++++++---------------- libswfdec/swfdec_as_object.c | 2 - test/trace/Makefile.am | 9 ++++++++ test/trace/function-apply-crash-5.swf |binary test/trace/function-apply-crash-6.swf |binary test/trace/function-apply-crash-7.swf |binary test/trace/function-apply-crash-8.swf |binary test/trace/function-apply-crash.as | 7 ++++++ 8 files changed, 36 insertions(+), 17 deletions(-) New commits: diff-tree 28bdc729ce326cb4b08540d6e0cae1c67a793ebe (from 65259fb7606118b8357b08abcdee90f4438b48b7) Author: Benjamin Otte <otte at gnome.org> Date: Fri Sep 14 12:29:26 2007 +0200 add test for last commit diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index eb8a89a..10e2210 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -503,6 +503,15 @@ EXTRA_DIST = \ function-apply-6.swf.trace \ function-apply-7.swf \ function-apply-7.swf.trace \ + function-apply-crash.as \ + function-apply-crash-5.swf \ + function-apply-crash-5.swf.trace \ + function-apply-crash-6.swf \ + function-apply-crash-6.swf.trace \ + function-apply-crash-7.swf \ + function-apply-crash-7.swf.trace \ + function-apply-crash-8.swf \ + function-apply-crash-8.swf.trace \ function-prototype-chain.swf \ function-prototype-chain.swf.trace \ function-scope.as \ diff --git a/test/trace/function-apply-crash-5.swf b/test/trace/function-apply-crash-5.swf new file mode 100644 index 0000000..dabdb1d Binary files /dev/null and b/test/trace/function-apply-crash-5.swf differ diff --git a/test/trace/function-apply-crash-5.swf.trace b/test/trace/function-apply-crash-5.swf.trace new file mode 100644 index 0000000..e69de29 diff --git a/test/trace/function-apply-crash-6.swf b/test/trace/function-apply-crash-6.swf new file mode 100644 index 0000000..0331122 Binary files /dev/null and b/test/trace/function-apply-crash-6.swf differ diff --git a/test/trace/function-apply-crash-6.swf.trace b/test/trace/function-apply-crash-6.swf.trace new file mode 100644 index 0000000..e69de29 diff --git a/test/trace/function-apply-crash-7.swf b/test/trace/function-apply-crash-7.swf new file mode 100644 index 0000000..ff1a77a Binary files /dev/null and b/test/trace/function-apply-crash-7.swf differ diff --git a/test/trace/function-apply-crash-7.swf.trace b/test/trace/function-apply-crash-7.swf.trace new file mode 100644 index 0000000..e69de29 diff --git a/test/trace/function-apply-crash-8.swf b/test/trace/function-apply-crash-8.swf new file mode 100644 index 0000000..03b6e56 Binary files /dev/null and b/test/trace/function-apply-crash-8.swf differ diff --git a/test/trace/function-apply-crash-8.swf.trace b/test/trace/function-apply-crash-8.swf.trace new file mode 100644 index 0000000..e69de29 diff --git a/test/trace/function-apply-crash.as b/test/trace/function-apply-crash.as new file mode 100644 index 0000000..b265ca8 --- /dev/null +++ b/test/trace/function-apply-crash.as @@ -0,0 +1,7 @@ +// makeswf -v 7 -s 200x150 -r 1 -o function-apply-crash.swf function-apply-crash.as + +a = []; +a[10000] = "moi"; +Object.prototype.isPrototypeOf.apply (this, a); + +loadMovie ("FSCommand:quit", ""); diff-tree 65259fb7606118b8357b08abcdee90f4438b48b7 (from ab6ffb4d04434ff98ae0df7cfe1b302479fd74e6) Author: Benjamin Otte <otte at gnome.org> Date: Fri Sep 14 12:27:23 2007 +0200 document that the args need to stay available. diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index 3af3b46..b1fdec2 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -105,7 +105,9 @@ swfdec_as_function_set_constructor (Swfd * @function: the #SwfdecAsFunction to call * @thisp: this argument to use for the call or %NULL for none * @n_args: number of arguments to pass to the function - * @args: the arguments to pass or %NULL to read the last @n_args stack elements + * @args: the arguments to pass or %NULL to read the last @n_args stack elements. + * The memory must be unchanged until the function call has completed. + * This is after the call to swfdec_as_context_run () has finished. * @return_value: pointer for return value or %NULL to push the return value to * the stack * diff-tree ab6ffb4d04434ff98ae0df7cfe1b302479fd74e6 (from b4647a3053056d27c63cee6acdd9140766ced411) Author: Benjamin Otte <otte at gnome.org> Date: Fri Sep 14 12:25:42 2007 +0200 fix Function.apply It used to free argv before calling swfdec_as_context_run() diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index 6cc40a4..3af3b46 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -172,6 +172,8 @@ void swfdec_as_function_apply (SwfdecAsContext *cx, SwfdecAsObject *fun, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { + SwfdecAsValue *argv_pass = NULL; + int length = 0; SwfdecAsObject *thisp; if (argc > 0) { @@ -182,11 +184,10 @@ swfdec_as_function_apply (SwfdecAsContex if (thisp == NULL) thisp = swfdec_as_object_new_empty (cx); - if (argc > 1 && SWFDEC_AS_VALUE_IS_OBJECT (&argv[1])) - { - int length, i; + if (argc > 1 && SWFDEC_AS_VALUE_IS_OBJECT (&argv[1])) { + int i; SwfdecAsObject *array; - SwfdecAsValue val, *argv_pass; + SwfdecAsValue val; array = SWFDEC_AS_VALUE_GET_OBJECT (&argv[1]); @@ -194,6 +195,9 @@ swfdec_as_function_apply (SwfdecAsContex length = swfdec_as_value_to_integer (cx, &val); if (length > 0) { + /* FIXME: find a smarter way to do this, like providing argv not as an array */ + if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecAsValue) * length)) + return; argv_pass = g_malloc (sizeof (SwfdecAsValue) * length); for (i = 0; i < length; i++) { @@ -201,21 +205,18 @@ swfdec_as_function_apply (SwfdecAsContex swfdec_as_double_to_string (cx, i), &argv_pass[i]); } } else { - argv_pass = NULL; + length = 0; } - - swfdec_as_function_call (SWFDEC_AS_FUNCTION (fun), thisp, length, - argv_pass, ret); - - if (argv_pass != NULL) - g_free (argv_pass); - } - else - { - swfdec_as_function_call (SWFDEC_AS_FUNCTION (fun), thisp, 0, NULL, ret); } + swfdec_as_function_call (SWFDEC_AS_FUNCTION (fun), thisp, length, + argv_pass, ret); swfdec_as_context_run (cx); + + if (argv_pass) { + swfdec_as_context_unuse_mem (cx, sizeof (SwfdecAsValue) * length); + g_free (argv_pass); + } } void diff-tree b4647a3053056d27c63cee6acdd9140766ced411 (from 3da08c899f62a2f814dcacabb3214870578ccabc) Author: Benjamin Otte <otte at gnome.org> Date: Thu Sep 13 22:16:31 2007 +0200 use g_ascii_strcasecmp here diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 81631c7..fd67729 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -176,7 +176,7 @@ swfdec_as_object_do_add (SwfdecAsObject static gboolean swfdec_as_object_lookup_case_insensitive (gpointer key, gpointer value, gpointer user_data) { - return strcasecmp (key, user_data) == 0; + return g_ascii_strcasecmp (key, user_data) == 0; } static gboolean
Seemingly Similar Threads
- 8 commits - libswfdec/swfdec_as_function.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_object.c libswfdec/swfdec_as_strings.c test/trace
- Branch 'as' - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_script_function.c
- 7 commits - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_super.c libswfdec/swfdec_as_super.h
- 4 commits - libswfdec/swfdec_asbroadcaster.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_interpret.c test/trace
- Branch 'as' - 9 commits - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_script_function.c