[Swfdec] libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie_html.c

Pekka Lampila medar at kemper.freedesktop.org
Thu Nov 1 07:36:05 PDT 2007


 libswfdec/swfdec_text_field_movie.c      |   18 +++++++++++++++++
 libswfdec/swfdec_text_field_movie_html.c |   32 +++++++++++++++++--------------
 2 files changed, 36 insertions(+), 14 deletions(-)

New commits:
commit e1f14212d5a236453dd64426cfde8e6646b526d7
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Nov 1 16:32:52 2007 +0200

    Don't crash in TextField when swfdec_text_format_new or _copy return NULL

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 4dd9c07..5d499b2 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -1063,6 +1063,10 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text,
       findex_new = g_new (SwfdecFormatIndex, 1);
       findex_new->index_ = end_index;
       findex_new->format = swfdec_text_format_copy (findex->format);
+      if (findex_new->format == NULL) {
+	g_free (findex_new);
+	break;
+      }
 
       iter = g_slist_insert (iter, findex_new, 1);
     }
@@ -1071,6 +1075,10 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text,
       findex_new = g_new (SwfdecFormatIndex, 1);
       findex_new->index_ = start_index;
       findex_new->format = swfdec_text_format_copy (findex->format);
+      if (findex_new->format == NULL) {
+	g_free (findex_new);
+	break;
+      }
       swfdec_text_format_add (findex_new->format, format);
 
       iter = g_slist_insert (iter, findex_new, 1);
@@ -1352,6 +1360,11 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_return_if_fail (str != NULL);
 
+  if (text->format_new == NULL) {
+    text->input = g_string_truncate (text->input, 0);
+    return;
+  }
+
   // remove old formatting info
   iter = text->formats;
   while (iter) {
@@ -1368,6 +1381,11 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
   block->index_ = 0;
   g_assert (SWFDEC_IS_TEXT_FORMAT (text->format_new));
   block->format = swfdec_text_format_copy (text->format_new);
+  if (block->format == NULL) {
+    g_free (block);
+    text->input = g_string_truncate (text->input, 0);
+    return;
+  }
   text->formats = g_slist_prepend (text->formats, block);
 
   text->input_html = html;
diff --git a/libswfdec/swfdec_text_field_movie_html.c b/libswfdec/swfdec_text_field_movie_html.c
index ef22415..ba60530 100644
--- a/libswfdec/swfdec_text_field_movie_html.c
+++ b/libswfdec/swfdec_text_field_movie_html.c
@@ -352,19 +352,23 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
     data->tags_open = g_slist_prepend (data->tags_open, tag);
 
     // set format based on tag
-    object = SWFDEC_AS_OBJECT (tag->format);
-    SWFDEC_AS_VALUE_SET_BOOLEAN (&val, TRUE);
-
-    if (tag->name_length == 2 && !g_strncasecmp (tag->name, "li", 2)) {
-      swfdec_as_object_set_variable (object, SWFDEC_AS_STR_bullet, &val);
-    } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "b", 1)) {
-      swfdec_as_object_set_variable (object, SWFDEC_AS_STR_bold, &val);
-    } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "i", 1)) {
-      swfdec_as_object_set_variable (object, SWFDEC_AS_STR_italic, &val);
-    } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "u", 1)) {
-      swfdec_as_object_set_variable (object, SWFDEC_AS_STR_underline, &val);
-    } else if (tag->name_length == 3 && !g_strncasecmp (tag->name, "img", 3)) {
-      SWFDEC_FIXME ("IMG tag support for TextField's HTML input missing");
+    if (tag->format != NULL) {
+      object = SWFDEC_AS_OBJECT (tag->format);
+      SWFDEC_AS_VALUE_SET_BOOLEAN (&val, TRUE);
+
+      if (tag->name_length == 2 && !g_strncasecmp (tag->name, "li", 2)) {
+	swfdec_as_object_set_variable (object, SWFDEC_AS_STR_bullet, &val);
+      } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "b", 1)) {
+	swfdec_as_object_set_variable (object, SWFDEC_AS_STR_bold, &val);
+      } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "i", 1)) {
+	swfdec_as_object_set_variable (object, SWFDEC_AS_STR_italic, &val);
+      } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "u", 1)) {
+	swfdec_as_object_set_variable (object, SWFDEC_AS_STR_underline, &val);
+      }
+      else if (tag->name_length == 3 && !g_strncasecmp (tag->name, "img", 3))
+      {
+	SWFDEC_FIXME ("IMG tag support for TextField's HTML input missing");
+      }
     }
 
     if (data->style_sheet &&
@@ -478,7 +482,7 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
   while (data.tags_closed != NULL) {
     ParserTag *tag = (ParserTag *)data.tags_closed->data;
 
-    if (tag->index != tag->end_index) {
+    if (tag->index != tag->end_index && tag->format != NULL) {
       swfdec_text_field_movie_set_text_format (text, tag->format, tag->index,
 	  tag->end_index);
     }


More information about the Swfdec mailing list