From acb7f6449a8c553e4e4564cc24ed9916168b7e5f Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 20 Jul 2008 00:34:58 +0000 Subject: [PATCH] =?UTF-8?q?543504=20=E2=80=93=20crash=20in=20Epiphany=20We?= =?UTF-8?q?b=20Browser:=20Opening=20local=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-07-19 Matthias Clasen 543504 – crash in Epiphany Web Browser: Opening local file * gappinfo.c: * gasyncresult.c: * gdesktopappinfo.c: * gdrive.c: * gfile.c: * gicon.c: * gloadableicon.c: * gmount.c: * gseekable.c: * gvolume.c: Register types thread-safely. Patch by Christian Persch svn path=/trunk/; revision=7208 --- gio/ChangeLog | 16 ++++++++++++++++ gio/gappinfo.c | 15 ++++++++------- gio/gasyncresult.c | 15 ++++++++------- gio/gdesktopappinfo.c | 15 ++++++++------- gio/gdrive.c | 15 ++++++++------- gio/gfile.c | 15 ++++++++------- gio/gicon.c | 15 ++++++++------- gio/gloadableicon.c | 15 ++++++++------- gio/gmount.c | 15 ++++++++------- gio/gseekable.c | 15 ++++++++------- gio/gvolume.c | 15 ++++++++------- 11 files changed, 96 insertions(+), 70 deletions(-) diff --git a/gio/ChangeLog b/gio/ChangeLog index b2760c68c..df1236880 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,19 @@ +2008-07-19 Matthias Clasen + + 543504 – crash in Epiphany Web Browser: Opening local file + + * gappinfo.c: + * gasyncresult.c: + * gdesktopappinfo.c: + * gdrive.c: + * gfile.c: + * gicon.c: + * gloadableicon.c: + * gmount.c: + * gseekable.c: + * gvolume.c: Register types thread-safely. + Patch by Christian Persch + 2008-07-18 Matthias Clasen * gcontenttype.c: Remove debug spew diff --git a/gio/gappinfo.c b/gio/gappinfo.c index f2a53324f..5352aeabd 100644 --- a/gio/gappinfo.c +++ b/gio/gappinfo.c @@ -46,11 +46,11 @@ static void g_app_info_class_init (gpointer g_class, GType g_app_info_get_type (void) { - static GType app_info_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! app_info_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo app_info_info = + const GTypeInfo app_info_info = { sizeof (GAppInfoIface), /* class_size */ g_app_info_base_init, /* base_init */ @@ -62,15 +62,16 @@ g_app_info_get_type (void) 0, /* n_preallocs */ NULL }; - - app_info_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GAppInfo"), &app_info_info, 0); - g_type_interface_add_prerequisite (app_info_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return app_info_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gasyncresult.c b/gio/gasyncresult.c index ba2976e20..4eb2a36d8 100644 --- a/gio/gasyncresult.c +++ b/gio/gasyncresult.c @@ -115,11 +115,11 @@ static void g_async_result_class_init (gpointer g_class, GType g_async_result_get_type (void) { - static GType async_result_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! async_result_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo async_result_info = + const GTypeInfo async_result_info = { sizeof (GAsyncResultIface), /* class_size */ g_async_result_base_init, /* base_init */ @@ -131,15 +131,16 @@ g_async_result_get_type (void) 0, /* n_preallocs */ NULL }; - - async_result_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GAsyncResult"), &async_result_info, 0); - g_type_interface_add_prerequisite (async_result_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return async_result_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index 9a384b198..f8ad6bfd0 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -2502,11 +2502,11 @@ static void g_desktop_app_info_lookup_class_init (gpointer g_class, GType g_desktop_app_info_lookup_get_type (void) { - static GType desktop_app_info_lookup_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! desktop_app_info_lookup_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo desktop_app_info_lookup_info = + const GTypeInfo desktop_app_info_lookup_info = { sizeof (GDesktopAppInfoLookupIface), /* class_size */ g_desktop_app_info_lookup_base_init, /* base_init */ @@ -2518,15 +2518,16 @@ g_desktop_app_info_lookup_get_type (void) 0, /* n_preallocs */ NULL }; - - desktop_app_info_lookup_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GDesktopAppInfoLookup"), &desktop_app_info_lookup_info, 0); - g_type_interface_add_prerequisite (desktop_app_info_lookup_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return desktop_app_info_lookup_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gdrive.c b/gio/gdrive.c index 9d912042e..70386997a 100644 --- a/gio/gdrive.c +++ b/gio/gdrive.c @@ -61,11 +61,11 @@ static void g_drive_class_init (gpointer g_class, GType g_drive_get_type (void) { - static GType drive_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! drive_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo drive_info = + const GTypeInfo drive_info = { sizeof (GDriveIface), /* class_size */ g_drive_base_init, /* base_init */ @@ -77,15 +77,16 @@ g_drive_get_type (void) 0, /* n_preallocs */ NULL }; - - drive_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GDrive"), &drive_info, 0); - g_type_interface_add_prerequisite (drive_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return drive_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gfile.c b/gio/gfile.c index e056942a1..25f99e3cd 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -241,11 +241,11 @@ static gboolean g_file_real_copy_finish (GFile GType g_file_get_type (void) { - static GType file_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! file_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo file_info = + const GTypeInfo file_info = { sizeof (GFileIface), /* class_size */ g_file_base_init, /* base_init */ @@ -257,15 +257,16 @@ g_file_get_type (void) 0, /* n_preallocs */ NULL }; - - file_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GFile"), &file_info, 0); - g_type_interface_add_prerequisite (file_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return file_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gicon.c b/gio/gicon.c index 567118b7a..aafa5034a 100644 --- a/gio/gicon.c +++ b/gio/gicon.c @@ -51,11 +51,11 @@ static void g_icon_class_init (gpointer g_class, GType g_icon_get_type (void) { - static GType icon_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! icon_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo icon_info = + const GTypeInfo icon_info = { sizeof (GIconIface), /* class_size */ g_icon_base_init, /* base_init */ @@ -67,15 +67,16 @@ g_icon_get_type (void) 0, /* n_preallocs */ NULL }; - - icon_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GIcon"), &icon_info, 0); - g_type_interface_add_prerequisite (icon_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return icon_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gloadableicon.c b/gio/gloadableicon.c index dd6e47812..b5ba6f568 100644 --- a/gio/gloadableicon.c +++ b/gio/gloadableicon.c @@ -55,11 +55,11 @@ static void g_loadable_icon_class_init (gpointer g_c GType g_loadable_icon_get_type (void) { - static GType loadable_icon_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! loadable_icon_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo loadable_icon_info = + const GTypeInfo loadable_icon_info = { sizeof (GLoadableIconIface), /* class_size */ g_loadable_icon_base_init, /* base_init */ @@ -71,15 +71,16 @@ g_loadable_icon_get_type (void) 0, /* n_preallocs */ NULL }; - - loadable_icon_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GLoadableIcon"), &loadable_icon_info, 0); - g_type_interface_add_prerequisite (loadable_icon_type, G_TYPE_ICON); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_ICON); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return loadable_icon_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gmount.c b/gio/gmount.c index 1870b8824..6f15f7cc6 100644 --- a/gio/gmount.c +++ b/gio/gmount.c @@ -70,11 +70,11 @@ static void g_mount_class_init (gpointer g_class, GType g_mount_get_type (void) { - static GType mount_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! mount_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo mount_info = + const GTypeInfo mount_info = { sizeof (GMountIface), /* class_size */ g_mount_base_init, /* base_init */ @@ -86,15 +86,16 @@ g_mount_get_type (void) 0, /* n_preallocs */ NULL }; - - mount_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GMount"), &mount_info, 0); - g_type_interface_add_prerequisite (mount_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return mount_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gseekable.c b/gio/gseekable.c index 0e5707b3e..a2cbb8a5c 100644 --- a/gio/gseekable.c +++ b/gio/gseekable.c @@ -44,11 +44,11 @@ static void g_seekable_base_init (gpointer g_class); GType g_seekable_get_type (void) { - static GType seekable_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (!seekable_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo seekable_info = + const GTypeInfo seekable_info = { sizeof (GSeekableIface), /* class_size */ g_seekable_base_init, /* base_init */ @@ -60,15 +60,16 @@ g_seekable_get_type (void) 0, /* n_preallocs */ NULL }; - - seekable_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GSeekable"), &seekable_info, 0); - g_type_interface_add_prerequisite (seekable_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return seekable_type; + return g_define_type_id__volatile; } static void diff --git a/gio/gvolume.c b/gio/gvolume.c index 5f56bb7fa..88276aa9a 100644 --- a/gio/gvolume.c +++ b/gio/gvolume.c @@ -80,11 +80,11 @@ static void g_volume_class_init (gpointer g_class, GType g_volume_get_type (void) { - static GType volume_type = 0; + static volatile gsize g_define_type_id__volatile = 0; - if (! volume_type) + if (g_once_init_enter (&g_define_type_id__volatile)) { - static const GTypeInfo volume_info = + const GTypeInfo volume_info = { sizeof (GVolumeIface), /* class_size */ g_volume_base_init, /* base_init */ @@ -96,15 +96,16 @@ g_volume_get_type (void) 0, /* n_preallocs */ NULL }; - - volume_type = + GType g_define_type_id = g_type_register_static (G_TYPE_INTERFACE, I_("GVolume"), &volume_info, 0); - g_type_interface_add_prerequisite (volume_type, G_TYPE_OBJECT); + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } - return volume_type; + return g_define_type_id__volatile; } static void