diff options
author | Michael Ruprecht <maiku@pidgin.im> | 2008-08-16 20:22:41 +0000 |
---|---|---|
committer | Michael Ruprecht <maiku@pidgin.im> | 2008-08-16 20:22:41 +0000 |
commit | 81189b991acfef1411ec81970befd3e2312b42e2 (patch) | |
tree | f373676689d0a8948571615a597dfc6957d0922b | |
parent | 26854fcd00faf5bd76ea3248c9730394931931e9 (diff) | |
download | pidgin-81189b991acfef1411ec81970befd3e2312b42e2.tar.gz |
Fix crash when gstreamer audio or video factory can't be found. References #6605
-rw-r--r-- | libpurple/media.c | 7 | ||||
-rw-r--r-- | libpurple/media.h | 2 | ||||
-rw-r--r-- | pidgin/gtkprefs.c | 28 |
3 files changed, 26 insertions, 11 deletions
diff --git a/libpurple/media.c b/libpurple/media.c index e941fbe89b..cf938869f4 100644 --- a/libpurple/media.c +++ b/libpurple/media.c @@ -749,7 +749,12 @@ GstElement * purple_media_get_element(const gchar *factory_name) { GstElementFactory *factory = gst_element_factory_find(factory_name); - GstElement *element = gst_element_factory_create(factory, NULL); + GstElement *element; + + if (factory == NULL) + return NULL; + + element = gst_element_factory_create(factory, NULL); gst_object_unref(factory); return element; } diff --git a/libpurple/media.h b/libpurple/media.h index 31e8c298f4..438f26c576 100644 --- a/libpurple/media.h +++ b/libpurple/media.h @@ -335,7 +335,7 @@ GValue *purple_media_element_get_device(GstElement *element); * * @param factory_name Name of the factory to create an element from. * - * @return The element that was created. + * @return The element that was created, NULL if it couldn't find the factory. */ GstElement *purple_media_get_element(const gchar *factory_name); diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c index 5587b7fee5..3a091b951d 100644 --- a/pidgin/gtkprefs.c +++ b/pidgin/gtkprefs.c @@ -2112,10 +2112,14 @@ media_plugin_changed_cb(const gchar *name, PurplePrefType type, const char *plugin = value; const char *device = purple_prefs_get_string("/purple/media/video/device"); GstElement *video = purple_media_get_element(plugin); - GList *video_devices = purple_media_get_devices(video); - GList *video_items = get_device_items(video, video_devices); + GList *video_items = NULL; GList *list; - g_list_free(video_devices); + + if (video != NULL) { + GList *video_devices = purple_media_get_devices(video); + video_items = get_device_items(video, video_devices); + g_list_free(video_devices); + } if (video_items == NULL) { video_items = g_list_prepend(video_items, g_strdup("")); @@ -2165,14 +2169,20 @@ media_page() GstElement *video = purple_media_get_element(plugin); GstElement *audio = purple_media_get_element("alsasrc"); - GList *video_devices = purple_media_get_devices(video); - GList *audio_devices = purple_media_get_devices(audio); + GList *video_items = NULL; + GList *audio_items = NULL; - GList *video_items = get_device_items(video, video_devices); - GList *audio_items = get_device_items(audio, audio_devices); + if (video != NULL) { + GList *video_devices = purple_media_get_devices(video); + video_items = get_device_items(video, video_devices); + g_list_free(video_devices); + } - g_list_free(video_devices); - g_list_free(audio_devices); + if (audio != NULL) { + GList *audio_devices = purple_media_get_devices(audio); + audio_items = get_device_items(audio, audio_devices); + g_list_free(audio_devices); + } if (video_items == NULL) { video_items = g_list_prepend(video_items, ""); |