[telepathy-gabble/telepathy-gabble-0.8] gabble_decode_jid(): return FALSE if JID components are wrongly empty

Dafydd Harries dafydd.harries at collabora.co.uk
Tue Aug 25 10:05:25 PDT 2009


The domain must always be non-empty. The node must not be empty if there is an
'@', and the resource must not be empty if there is a '/'.
---
 src/util.c              |   13 ++++++++++++-
 tests/test-jid-decode.c |   38 ++++++++++++++++++++++++++++++++++++--
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/util.c b/src/util.c
index 685739e..9d8135c 100644
--- a/src/util.c
+++ b/src/util.c
@@ -474,9 +474,20 @@ gabble_decode_jid (const gchar *jid,
       tmp_resource++;
     }
 
+  /* Domain must be non-empty. If the node or the resource exist, they must be
+   * non-empty.
+   */
+  if (*tmp_domain == '\0' ||
+      (tmp_node != NULL && *tmp_node == '\0') ||
+      (tmp_resource != NULL && *tmp_resource == '\0'))
+    {
+      g_free (tmp_jid);
+      return FALSE;
+    }
+
   /* the server must be stored after we find the resource, in case we
    * truncated a resource from it */
-  if (tmp_domain != NULL && domain != NULL)
+  if (domain != NULL)
     *domain = g_utf8_strdown (tmp_domain, -1);
 
   /* store the username if the user provided a pointer */
diff --git a/tests/test-jid-decode.c b/tests/test-jid-decode.c
index bc780dd..6fefeec 100644
--- a/tests/test-jid-decode.c
+++ b/tests/test-jid-decode.c
@@ -12,9 +12,9 @@ test1 (void)
   gchar *server = NULL;
   gchar *resource = NULL;
 
-  g_assert (gabble_decode_jid ("", &node, &server, &resource));
+  g_assert (!gabble_decode_jid ("", &node, &server, &resource));
   g_assert (node == NULL);
-  g_assert (0 == strcmp (server, ""));
+  g_assert (server == NULL);
   g_assert (resource == NULL);
   g_free (server);
 }
@@ -64,6 +64,38 @@ test4 (void)
   g_free (resource);
 }
 
+static void
+test5 (void)
+{
+  gchar *node = NULL;
+  gchar *server = NULL;
+  gchar *resource = NULL;
+
+  g_assert (!gabble_decode_jid ("@bar", &node, &server, &resource));
+  g_assert (node == NULL);
+  g_assert (server == NULL);
+  g_assert (resource == NULL);
+  g_free (node);
+  g_free (server);
+  g_free (resource);
+}
+
+static void
+test6 (void)
+{
+  gchar *node = NULL;
+  gchar *server = NULL;
+  gchar *resource = NULL;
+
+  g_assert (!gabble_decode_jid ("foo at bar/", &node, &server, &resource));
+  g_assert (node == NULL);
+  g_assert (server == NULL);
+  g_assert (resource == NULL);
+  g_free (node);
+  g_free (server);
+  g_free (resource);
+}
+
 int
 main (void)
 {
@@ -71,6 +103,8 @@ main (void)
   test2 ();
   test3 ();
   test4 ();
+  test5 ();
+  test6 ();
 
   return 0;
 }
-- 
1.5.6.5




More information about the telepathy-commits mailing list