summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Ruprecht <maiku@pidgin.im>2008-08-16 20:22:41 +0000
committerMichael Ruprecht <maiku@pidgin.im>2008-08-16 20:22:41 +0000
commit81189b991acfef1411ec81970befd3e2312b42e2 (patch)
treef373676689d0a8948571615a597dfc6957d0922b
parent26854fcd00faf5bd76ea3248c9730394931931e9 (diff)
downloadpidgin-81189b991acfef1411ec81970befd3e2312b42e2.tar.gz
Fix crash when gstreamer audio or video factory can't be found. References #6605
-rw-r--r--libpurple/media.c7
-rw-r--r--libpurple/media.h2
-rw-r--r--pidgin/gtkprefs.c28
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, "");