Pekka Lampila
2007-Nov-01 10:30 UTC
[Swfdec] 4 commits - libswfdec/swfdec_sound_object.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c test/crashfinder.c test/Makefile.am
libswfdec/swfdec_sound_object.c | 3 libswfdec/swfdec_text_field_movie.c | 3 libswfdec/swfdec_text_field_movie_as.c | 1 test/Makefile.am | 8 + test/crashfinder.c | 154 +++++++++++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 5 deletions(-) New commits: commit 9d8541e233b6bb2a465bea0c7b8f8b66f37bb25a Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Nov 1 12:19:21 2007 +0200 Fix an another memory leak in TextField code diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 1858004..4dd9c07 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -51,8 +51,7 @@ static void swfdec_text_paragraph_add_attribute (SwfdecParagraph *paragraph, PangoAttribute *attr) { - paragraph->attrs - g_slist_prepend (paragraph->attrs, pango_attribute_copy (attr)); + paragraph->attrs = g_slist_prepend (paragraph->attrs, attr); } static void commit 5d0e30f1cc89df169e0b73cca83faa923f4b3be4 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 31 20:30:22 2007 +0200 Fix a memory leak in TextField code diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c index 7d91250..673600e 100644 --- a/libswfdec/swfdec_text_field_movie_as.c +++ b/libswfdec/swfdec_text_field_movie_as.c @@ -1225,6 +1225,7 @@ swfdec_text_field_movie_createTextField (SwfdecAsContext *cx, movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, parent->resource, SWFDEC_GRAPHIC (edittext), name); g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (movie)); + g_object_unref (edittext); swfdec_movie_initialize (movie); swfdec_movie_update (movie); commit a6df2d3a6f3d95846b9a0b516f2d1479ca208eb9 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 31 19:08:43 2007 +0200 Add test/crashfinder program that simply runs Flash files to find crashes diff --git a/test/Makefile.am b/test/Makefile.am index 8f74f60..1aca7fa 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -3,11 +3,15 @@ SUBDIRS = image sound trace various if WITH_GTK noinst_LTLIBRARIES = libswfedit.la -noinst_PROGRAMS = swfdec-extract dump swfedit swfscript +noinst_PROGRAMS = swfdec-extract dump swfedit swfscript crashfinder else -noinst_PROGRAMS = swfdec-extract dump +noinst_PROGRAMS = swfdec-extract dump crashfinder endif +crashfinder_CFLAGS = $(GLOBAL_CFLAGS) $(SWFDEC_CFLAGS) +crashfinder_LDFLAGS = $(SWFDEC_LIBS) $(CAIRO_LIBS) +crashfinder_SOURCES = crashfinder.c + dump_CFLAGS = $(GLOBAL_CFLAGS) $(SWFDEC_CFLAGS) $(CAIRO_CFLAGS) $(PANGO_CFLAGS) dump_LDFLAGS = $(SWFDEC_LIBS) $(CAIRO_LIBS) $(PANGO_LIBS) diff --git a/test/crashfinder.c b/test/crashfinder.c new file mode 100644 index 0000000..418c9d0 --- /dev/null +++ b/test/crashfinder.c @@ -0,0 +1,154 @@ +/* Copyright (C) 2007 Pekka Lampila <pekka.lampila at iki.fi> + * 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <libswfdec/swfdec.h> + +int +main (int argc, char **argv) +{ + GOptionContext *context; + GError *err; + SwfdecPlayer *player; + SwfdecLoader *loader; + guint i; + cairo_surface_t *surface; + cairo_t *cr; + gboolean aborts; + glong play_per_file = 30; + glong max_per_file = 60; + glong max_per_advance = 10; + GTimer *timer; + char **filenames = NULL; + const GOptionEntry entries[] = { + { + "play-time", 'p', 0, G_OPTION_ARG_INT, &play_per_file, + "How many seconds will be played from each file (default 30)", NULL + }, + { + "max-per-file", '\0', 0, G_OPTION_ARG_INT, &max_per_file, + "Maximum runtime in seconds allowed for each file (default 60)", NULL + }, + { + "max-per-advance", '\0', 0, G_OPTION_ARG_INT, &max_per_advance, + "Maximum runtime in seconds allowed for each advance (default 10)", NULL + }, + { + G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, + NULL, "<INPUT FILE> <OUTPUT FILE>" + }, + { + NULL + } + }; + + // init + swfdec_init (); + + // read command line params + context = g_option_context_new ("Run a Flash file trying to crash Swfdec"); + g_option_context_add_main_entries (context, entries, NULL); + + if (g_option_context_parse (context, &argc, &argv, &err) == FALSE) { + g_printerr ("Couldn't parse command-line options: %s\n", err->message); + g_error_free (err); + return 1; + } + + if (filenames == NULL || g_strv_length (filenames) < 1) { + g_printerr ("At least one input filename is required\n"); + return 1; + } + + // make them milliseconds + play_per_file *= 1000; + max_per_file *= 1000; + max_per_advance *= 1000; + + // create surface + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + cr = cairo_create (surface); + + aborts = FALSE; + for (i = 0; i < g_strv_length (filenames); i++) + { + glong played, advance, elapsed; + + g_print ("Running: %s\n", filenames[i]); + + // start timer + timer = g_timer_new (); + + // create player + loader = swfdec_file_loader_new (filenames[i]); + player = swfdec_player_new (NULL); + + if (loader->error) { + g_printerr ("Error loading %s: %s\n", filenames[i], loader->error); + g_object_unref (loader); + continue; + } + + swfdec_player_set_loader (player, loader); + + // loop until we have played what we wanted, or timelimit is hit + played = 0; + elapsed = 0; + while (played < play_per_file && + !swfdec_as_context_is_aborted (SWFDEC_AS_CONTEXT (player))) + { + elapsed = (glong)(g_timer_elapsed (timer, NULL) * 1000); + if (elapsed >= max_per_file) + break; + swfdec_player_set_maximum_runtime (player, + MIN (max_per_advance, max_per_file - elapsed)); + + advance = swfdec_player_get_next_event (player); + swfdec_player_advance (player, advance); + + swfdec_player_render (player, cr, 0, 0, 0, 0); + + played += advance; + } + + if (elapsed >= max_per_file || + swfdec_as_context_is_aborted (SWFDEC_AS_CONTEXT (player))) { + g_print ("Aborted: %s\n", filenames[i]); + aborts = TRUE; + } else { + g_print ("Finished: %s\n", filenames[i]); + } + + // clean up + g_object_unref (player); + g_timer_destroy (timer); + } + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + if (aborts) { + return 1; + } else { + return 0; + } +} commit e62589ee79f26dead719bfb2ab6f45f58f822693 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 31 15:10:40 2007 +0200 Fix an assert in swfdec_sound_object_mark diff --git a/libswfdec/swfdec_sound_object.c b/libswfdec/swfdec_sound_object.c index 85e870e..98d00a0 100644 --- a/libswfdec/swfdec_sound_object.c +++ b/libswfdec/swfdec_sound_object.c @@ -43,7 +43,8 @@ swfdec_sound_object_mark (SwfdecAsObject *object) { SwfdecSoundObject *sound = SWFDEC_SOUND_OBJECT (object); - swfdec_as_object_mark (SWFDEC_AS_OBJECT (sound->target)); + if (sound->target != NULL) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (sound->target)); SWFDEC_AS_OBJECT_CLASS (swfdec_sound_object_parent_class)->mark (object); }
Maybe Matching Threads
- 12 commits - configure.ac doc/swfdec.types Makefile.am test/crashfinder.c test/dump.c test/Makefile.am test/swfdec-extract.c test/swfdec_out.c test/swfdec_out.h test/swfedit.c test/swfedit_file.c test/swfedit_file.h test/swfedit_list.c test/swfedit_list.h
- 5 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_array.h libswfdec/swfdec_as_date.c libswfdec/swfdec_as_date.h libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_filter.c
- libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c
- 5 commits - libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_xml.c libswfdec/swfdec_xml_node.c
- 5 commits - libswfdec/swfdec_as_object.c libswfdec/swfdec_loader.c libswfdec/swfdec_style_sheet.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c test/swfdec_test_test.c