gst/gstinterface.c: Don't crash if the element supports the interface queried, but...
authorTim-Philipp Müller <tim@centricular.net>
Fri, 29 Feb 2008 18:38:54 +0000 (18:38 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Fri, 29 Feb 2008 18:38:54 +0000 (18:38 +0000)
Original commit message from CVS:
* gst/gstinterface.c: (gst_element_implements_interface):
Don't crash if the element supports the interface queried, but does
not implement GstImplementsInterface. Fixes #519584.
* tests/check/Makefile.am:
* tests/check/gst/.cvsignore:
* tests/check/gst/gstinterface.c:
Add unit test for the above.

ChangeLog
common
gst/gstinterface.c
tests/check/Makefile.am
tests/check/gst/.gitignore
tests/check/gst/gstinterface.c [new file with mode: 0644]

index 37ac16e..2938e6a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-02-29  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * gst/gstinterface.c: (gst_element_implements_interface):
+         Don't crash if the element supports the interface queried, but does
+         not implement GstImplementsInterface. Fixes #519584.
+
+       * tests/check/Makefile.am:
+       * tests/check/gst/.cvsignore:
+       * tests/check/gst/gstinterface.c:
+         Add unit test for the above.
+
 2008-02-29  Wim Taymans  <wim.taymans@collabora.co.uk>
 
        * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init):
diff --git a/common b/common
index e746d20..4fa1159 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit e746d20ef536a73aea9964666c7d5f6d5c9465df
+Subproject commit 4fa1159996900100f3a1cd3b43d7f0f027310cdb
index 3f8c347..1aedd2b 100644 (file)
@@ -102,6 +102,8 @@ gst_implements_interface_supported_default (GstImplementsInterface * interface,
 gboolean
 gst_element_implements_interface (GstElement * element, GType iface_type)
 {
+  g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
   if (G_TYPE_CHECK_INSTANCE_TYPE (G_OBJECT (element), iface_type)) {
     GstImplementsInterface *iface;
     GstImplementsInterfaceClass *ifclass;
@@ -110,6 +112,11 @@ gst_element_implements_interface (GstElement * element, GType iface_type)
         iface_type, GstImplementsInterface);
     ifclass = GST_IMPLEMENTS_INTERFACE_GET_CLASS (iface);
 
+    /* element implements iface_type but not GstImplementsInterface, so
+     * just assume the other interface is implemented unconditionally */
+    if (ifclass == NULL)
+      return TRUE;
+
     if (ifclass->supported != NULL &&
         ifclass->supported (iface, iface_type) == TRUE) {
       return TRUE;
index 57b59a9..bcc6523 100644 (file)
@@ -49,6 +49,7 @@ REGISTRY_CHECKS =                             \
        gst/gstelement                          \
        gst/gstevent                            \
        gst/gstghostpad                         \
+       gst/gstinterface                                \
        gst/gstplugin                           \
        gst/gstquery                            \
        gst/gstregistry                         \
index 69f3412..2a93de7 100644 (file)
@@ -10,6 +10,7 @@ gstelement
 gstevent
 gstghostpad
 gstiterator
+gstinterface
 gstmessage
 gstminiobject
 gstobject
diff --git a/tests/check/gst/gstinterface.c b/tests/check/gst/gstinterface.c
new file mode 100644 (file)
index 0000000..4697a1f
--- /dev/null
@@ -0,0 +1,62 @@
+/* GStreamer GstImplementsInterface check
+ * Copyright (C) 2008 Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_without_implements_interface)
+{
+  GstElement *element;
+
+  /* we shouldn't crash if someone tries to use
+   * gst_element_implements_interface() on an element which doesn't implement
+   * the GstImplementsInterface (neither if the element does implement the
+   * requested interface, nor if it doesn't) */
+  element = gst_element_factory_make ("filesrc", "filesrc");
+  fail_unless (element != NULL, "Could not create filesrc element");
+
+  /* does not implement GstImplementsInterface, but does implement the
+   * GstUriHandler interface, so should just return TRUE */
+  fail_if (!gst_element_implements_interface (element, GST_TYPE_URI_HANDLER));
+  fail_if (gst_element_implements_interface (element,
+          GST_TYPE_IMPLEMENTS_INTERFACE));
+  gst_object_unref (element);
+
+  element = gst_element_factory_make ("identity", "identity");
+  fail_unless (element != NULL, "Could not create identity element");
+  fail_if (gst_element_implements_interface (element, GST_TYPE_URI_HANDLER));
+  fail_if (gst_element_implements_interface (element,
+          GST_TYPE_IMPLEMENTS_INTERFACE));
+  gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_interface_suite (void)
+{
+  Suite *s = suite_create ("GstImplementsInterface");
+  TCase *tc_chain = tcase_create ("correctness");
+
+  suite_add_tcase (s, tc_chain);
+  tcase_add_test (tc_chain, test_without_implements_interface);
+  return s;
+}
+
+GST_CHECK_MAIN (gst_interface);