Pekka Lampila
2007-Dec-13 19:02 UTC
[Swfdec] 2 commits - libswfdec/swfdec_flash_security.c libswfdec/swfdec_flash_security.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c libswfdec/swfdec_resource_request.c libswfdec/swfdec_resource_request.h libswfdec/swfdec_security.h
libswfdec/swfdec_flash_security.c | 49 +++++++++++++++++++++++------------- libswfdec/swfdec_flash_security.h | 7 ++--- libswfdec/swfdec_net_stream.c | 2 - libswfdec/swfdec_player.c | 2 + libswfdec/swfdec_resource_request.c | 28 +++++++++++++++++--- libswfdec/swfdec_resource_request.h | 2 + libswfdec/swfdec_security.h | 2 - 7 files changed, 66 insertions(+), 26 deletions(-) New commits: commit fe10412fcc1698adf61b19fdf55fc25be7248651 Merge: dff3ed0... 9eb2e0d... Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Dec 13 19:47:47 2007 +0200 Merge branch 'master' of ssh://medar at git.freedesktop.org/git/swfdec/swfdec Conflicts: libswfdec/swfdec_player.c diff --cc libswfdec/swfdec_player.c index 5db8a3e,efe2798..8191f6a --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@@ -838,18 -860,16 +860,18 @@@ swfdec_player_dispose (GObject *object swfdec_player_stop_all_sounds (player); swfdec_player_resource_request_finish (player); - g_hash_table_destroy (player->registered_classes); + g_hash_table_destroy (priv->registered_classes); - while (player->roots) - swfdec_movie_destroy (player->roots->data); - if (player->resource) { + while (priv->roots) + swfdec_movie_destroy (priv->roots->data); + if (priv->resource) { + swfdec_flash_security_free_pending ( - SWFDEC_FLASH_SECURITY (player->resource)); - g_object_unref (player->resource); - player->resource = NULL; ++ SWFDEC_FLASH_SECURITY (priv->resource)); + g_object_unref (priv->resource); + priv->resource = NULL; } - while (player->rooted_objects) - swfdec_player_unroot_object (player, player->rooted_objects->data); + while (priv->rooted_objects) + swfdec_player_unroot_object (player, priv->rooted_objects->data); /* we do this here so references to GC'd objects get freed */ G_OBJECT_CLASS (swfdec_player_parent_class)->dispose (object); diff --cc libswfdec/swfdec_resource_request.c index f5bb5fc,020625d..8c3ddbf --- a/libswfdec/swfdec_resource_request.c +++ b/libswfdec/swfdec_resource_request.c @@@ -138,22 -128,12 +138,22 @@@ swfdec_request_resource_perform_load_ca } static void +swfdec_request_resource_perform_load_abort_callback (SwfdecPlayer *player, + gpointer data) +{ + SwfdecResourceRequest *request = data; + + swfdec_resource_request_free (request); +} + +static void swfdec_request_resource_perform_load (SwfdecPlayer *player, SwfdecResourceRequest *request) { - g_assert (player->resource); + g_assert (player->priv->resource); swfdec_player_request_resource_now (player, request->security, request->url, request->request, request->buffer, - swfdec_request_resource_perform_load_callback, request); + swfdec_request_resource_perform_load_callback, + swfdec_request_resource_perform_load_abort_callback, request); } static void commit dff3ed08822801e44702d463601a809bf3edde78 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Dec 13 18:00:33 2007 +0200 Fix freeing of policy loader related resources Fixes crash bug 13607 This is somewhat ugly. Will have to rework the whole thing soon diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index 03f15a4..21fe688 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -158,13 +158,13 @@ swfdec_flash_security_allow_cross_domain (SwfdecFlashSecurity *sec, if (g_slist_find_custom (sec->crossdomain_allowed, host, (GCompareFunc)g_ascii_strcasecmp)) { - callback (url, TRUE, user_data); + callback (url, 1, user_data); return; } if (g_slist_find_custom (sec->crossdomain_denied, host, (GCompareFunc)g_ascii_strcasecmp)) { - callback (url, FALSE, user_data); + callback (url, 0, user_data); return; } @@ -183,17 +183,17 @@ swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, SwfdecURLAllowFunc callback, gpointer user_data) { SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (guard); - gboolean allowed; + int status; switch (sec->sandbox) { case SWFDEC_SANDBOX_NONE: - allowed = FALSE; + status = 0; break; case SWFDEC_SANDBOX_REMOTE: if (swfdec_url_is_local (url)) { - allowed = FALSE; + status = 0; } else if (swfdec_flash_security_match_domain (sec->url, url)) { - allowed = TRUE; + status = 1; } else { swfdec_flash_security_allow_cross_domain (sec, url, callback, user_data); @@ -201,11 +201,15 @@ swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, } break; case SWFDEC_SANDBOX_LOCAL_FILE: - allowed = swfdec_url_is_local (url); + if (swfdec_url_is_local (url)) { + status = 1; + } else { + status = 0; + } break; case SWFDEC_SANDBOX_LOCAL_NETWORK: if (swfdec_url_is_local (url)) { - allowed = FALSE; + status = 0; } else { swfdec_flash_security_allow_cross_domain (sec, url, callback, user_data); @@ -213,15 +217,30 @@ swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, } break; case SWFDEC_SANDBOX_LOCAL_TRUSTED: - allowed = TRUE; + status = 1; break; default: g_assert_not_reached (); - allowed = FALSE; + status = 0; break; } - callback (url, allowed, user_data); + callback (url, status, user_data); +} + +void +swfdec_flash_security_free_pending (SwfdecFlashSecurity *sec) +{ + GSList *iter; + + for (iter = sec->allow_url_pending; iter != NULL; iter = iter->next) { + SwfdecAllowURLPending *pending = iter->data; + pending->callback (pending->url, -1, pending->user_data); + swfdec_url_free (pending->url); + g_free (pending); + } + g_slist_free (sec->allow_url_pending); + sec->allow_url_pending = NULL; } static void @@ -230,6 +249,8 @@ swfdec_flash_security_dispose (GObject *object) SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (object); GSList *iter; + g_assert (sec->allow_url_pending == NULL); + for (iter = sec->policy_loaders; iter != NULL; iter = iter->next) { swfdec_policy_loader_free (iter->data); } @@ -248,12 +269,6 @@ swfdec_flash_security_dispose (GObject *object) g_slist_free (sec->crossdomain_denied); sec->crossdomain_denied = NULL; - for (iter = sec->allow_url_pending; iter != NULL; iter = iter->next) { - g_free (iter->data); - } - g_slist_free (sec->allow_url_pending); - sec->allow_url_pending = NULL; - if (sec->url) { swfdec_url_free (sec->url); sec->url = NULL; diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h index 227de2b..fcb2aaf 100644 --- a/libswfdec/swfdec_flash_security.h +++ b/libswfdec/swfdec_flash_security.h @@ -63,10 +63,11 @@ struct _SwfdecFlashSecurityClass SwfdecSecurityClass security_class; }; -GType swfdec_flash_security_get_type (void); +GType swfdec_flash_security_get_type (void); -void swfdec_flash_security_set_url (SwfdecFlashSecurity * sec, - const SwfdecURL * url); +void swfdec_flash_security_set_url (SwfdecFlashSecurity * sec, + const SwfdecURL * url); +void swfdec_flash_security_free_pending (SwfdecFlashSecurity * sec); G_END_DECLS diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 35c8c8e..775974a 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -494,7 +494,7 @@ swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url) g_assert (cx->frame); swfdec_player_request_resource_now (SWFDEC_PLAYER (cx), cx->frame->security, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, - swfdec_net_stream_request_callback, stream); + swfdec_net_stream_request_callback, NULL, stream); } void diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 2c5f47c..5db8a3e 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -843,6 +843,8 @@ swfdec_player_dispose (GObject *object) while (player->roots) swfdec_movie_destroy (player->roots->data); if (player->resource) { + swfdec_flash_security_free_pending ( + SWFDEC_FLASH_SECURITY (player->resource)); g_object_unref (player->resource); player->resource = NULL; } diff --git a/libswfdec/swfdec_resource_request.c b/libswfdec/swfdec_resource_request.c index 7b17d12..f5bb5fc 100644 --- a/libswfdec/swfdec_resource_request.c +++ b/libswfdec/swfdec_resource_request.c @@ -53,17 +53,25 @@ typedef struct { SwfdecLoaderRequest request; SwfdecBuffer * buffer; SwfdecResourceFunc callback; + SwfdecResourceAbortFunc abort; gpointer user_data; } AllowCallbackData; static void swfdec_player_request_resource_allow_callback (const SwfdecURL *url, - gboolean allowed, gpointer data_) + int status, gpointer data_) { AllowCallbackData *data = data_; SwfdecLoader *loader; - if (!allowed) { + if (status < 0) { + if (data->abort != NULL) + data->abort (data->player, data->user_data); + g_free (data); + return; + } + + if (status == 0) { SWFDEC_ERROR ("not allowing access to %s", swfdec_url_get_url (url)); loader = NULL; } else { @@ -85,7 +93,8 @@ swfdec_player_request_resource_allow_callback (const SwfdecURL *url, void swfdec_player_request_resource_now (SwfdecPlayer *player, SwfdecSecurity *security, const char *url, SwfdecLoaderRequest req, - SwfdecBuffer *buffer, SwfdecResourceFunc callback, gpointer user_data) + SwfdecBuffer *buffer, SwfdecResourceFunc callback, + SwfdecResourceAbortFunc abort, gpointer user_data) { SwfdecURL *absolute; AllowCallbackData *data; @@ -99,6 +108,7 @@ swfdec_player_request_resource_now (SwfdecPlayer *player, data->request = req; data->buffer = buffer; data->callback = callback; + data->abort = abort; data->user_data = user_data; /* create absolute url first */ @@ -128,12 +138,22 @@ swfdec_request_resource_perform_load_callback (SwfdecPlayer *player, } static void +swfdec_request_resource_perform_load_abort_callback (SwfdecPlayer *player, + gpointer data) +{ + SwfdecResourceRequest *request = data; + + swfdec_resource_request_free (request); +} + +static void swfdec_request_resource_perform_load (SwfdecPlayer *player, SwfdecResourceRequest *request) { g_assert (player->resource); swfdec_player_request_resource_now (player, request->security, request->url, request->request, request->buffer, - swfdec_request_resource_perform_load_callback, request); + swfdec_request_resource_perform_load_callback, + swfdec_request_resource_perform_load_abort_callback, request); } static void diff --git a/libswfdec/swfdec_resource_request.h b/libswfdec/swfdec_resource_request.h index dffa2b4..af9c7c7 100644 --- a/libswfdec/swfdec_resource_request.h +++ b/libswfdec/swfdec_resource_request.h @@ -27,6 +27,7 @@ G_BEGIN_DECLS typedef struct _SwfdecResourceRequest SwfdecResourceRequest; typedef void (* SwfdecResourceFunc) (SwfdecPlayer *player, SwfdecLoader *loader, gpointer data); +typedef void (* SwfdecResourceAbortFunc) (SwfdecPlayer *player, gpointer data); typedef void (* SwfdecResourceUnloadFunc) (SwfdecPlayer *player, const char *target, gpointer data); typedef enum { @@ -75,6 +76,7 @@ void swfdec_player_request_resource_now (SwfdecPlayer * player, SwfdecLoaderRequest req, SwfdecBuffer * buffer, SwfdecResourceFunc callback, + SwfdecResourceAbortFunc abort, gpointer user_data); void swfdec_player_request_unload (SwfdecPlayer * player, const char * target, diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h index cb89f57..2933b44 100644 --- a/libswfdec/swfdec_security.h +++ b/libswfdec/swfdec_security.h @@ -28,7 +28,7 @@ G_BEGIN_DECLS typedef struct _SwfdecSecurity SwfdecSecurity; typedef struct _SwfdecSecurityClass SwfdecSecurityClass; -typedef void (* SwfdecURLAllowFunc) (const SwfdecURL *url, gboolean allowed, gpointer data); +typedef void (* SwfdecURLAllowFunc) (const SwfdecURL *url, int status, gpointer data); #define SWFDEC_TYPE_SECURITY (swfdec_security_get_type()) #define SWFDEC_IS_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SECURITY))
Apparently Analagous Threads
- 70 commits - configure.ac libswfdec-gtk/Makefile.am libswfdec-gtk/swfdec-gtk.h libswfdec-gtk/swfdec_gtk_loader.c libswfdec-gtk/swfdec_gtk_player.c libswfdec-gtk/swfdec_gtk_socket.c libswfdec-gtk/swfdec_gtk_socket.h libswfdec-gtk/swfdec_playback_alsa.c
- 6 commits - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_as_object.c libswfdec/swfdec_as_script_function.c libswfdec/swfdec_flash_security.c
- 11 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource_request.c
- 18 commits - doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_event.c libswfdec/swfdec_event.h libswfdec/swfdec_flash_security.c
- 36 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_date.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_strings.c libswfdec/swfdec_flash_security.c