rtspsrc: Fix regression when using hostname in the location property
authorNirbheek Chauhan <nirbheek@centricular.com>
Wed, 16 Nov 2022 08:03:39 +0000 (13:33 +0530)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 16 Nov 2022 11:30:26 +0000 (11:30 +0000)
When the address can't be parsed as an IP address, it should just be
treated as a hostname and used as-is.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1576

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3420>

subprojects/gst-plugins-good/gst/rtsp/gstrtspsrc.c

index 9ef30eb..bcaf9b0 100644 (file)
@@ -4469,25 +4469,29 @@ element_make_from_addr (const GstURIType type, const char *addr_s,
   char *uri = NULL;
 
   addr = g_inet_address_new_from_string (addr_s);
-
-  switch (g_inet_address_get_family (addr)) {
-    case G_SOCKET_FAMILY_IPV6:
-      uri = g_strdup_printf ("udp://[%s]:%i", addr_s, port);
-      break;
-    case G_SOCKET_FAMILY_INVALID:
-      GST_ERROR ("Unknown family type for %s", addr_s);
-      goto out;
-    case G_SOCKET_FAMILY_UNIX:
-      GST_ERROR ("Unexpected family type UNIX for %s", addr_s);
-      goto out;
-    case G_SOCKET_FAMILY_IPV4:
-      uri = g_strdup_printf ("udp://%s:%i", addr_s, port);
-      break;
+  if (addr == NULL) {
+    /* Address is a hostname, not an IP address */
+    uri = g_strdup_printf ("udp://%s:%i", addr_s, port);
+  } else {
+    switch (g_inet_address_get_family (addr)) {
+      case G_SOCKET_FAMILY_IPV6:
+        uri = g_strdup_printf ("udp://[%s]:%i", addr_s, port);
+        break;
+      case G_SOCKET_FAMILY_INVALID:
+        GST_ERROR ("Unknown family type for %s", addr_s);
+        goto out;
+      case G_SOCKET_FAMILY_UNIX:
+        GST_ERROR ("Unexpected family type UNIX for %s", addr_s);
+        goto out;
+      case G_SOCKET_FAMILY_IPV4:
+        uri = g_strdup_printf ("udp://%s:%i", addr_s, port);
+        break;
+    }
   }
 
   element = gst_element_make_from_uri (type, uri, name, error);
 out:
-  g_object_unref (addr);
+  g_clear_object (&addr);
   g_free (uri);
   return element;
 }