]> git.sesse.net Git - vlc/blobdiff - src/stream_output/sdp.c
Repair SAP + SSM
[vlc] / src / stream_output / sdp.c
index 38c32ff3f3b5eea4fb1baba353c5376fea4b765d..d49a92afb0519fb6d394830a125a566cb84ab889 100644 (file)
 static
 char *AddressToSDP (const struct sockaddr *addr, socklen_t addrlen, char *buf)
 {
+    if (addrlen < offsetof (struct sockaddr, sa_family)
+                 + sizeof (addr->sa_family))
+        return NULL;
+
     const char *ttl = NULL;
     strcpy (buf, "IN IP* ");
 
@@ -57,7 +61,7 @@ char *AddressToSDP (const struct sockaddr *addr, socklen_t addrlen, char *buf)
             return NULL;
     }
 
-    if (vlc_getnameinfo (addr, addrlen, buf + 4, MAXSDPADDRESS - 4, NULL,
+    if (vlc_getnameinfo (addr, addrlen, buf + 7, MAXSDPADDRESS - 7, NULL,
                          NI_NUMERICHOST))
         return NULL;
 
@@ -81,12 +85,13 @@ static vlc_bool_t IsSDPString (const char *str)
 
 
 char *StartSDP (const char *name, const char *description, const char *url,
-                const char *email, const char *phone,
+                const char *email, const char *phone, vlc_bool_t ssm,
                 const struct sockaddr *orig, socklen_t origlen,
                 const struct sockaddr *addr, socklen_t addrlen)
 {
     uint64_t t = NTPtime64 ();
-    char *sdp, machine[MAXSDPADDRESS], conn[MAXSDPADDRESS];
+    char *sdp, machine[MAXSDPADDRESS], conn[MAXSDPADDRESS],
+         sfilter[MAXSDPADDRESS + sizeof ("\r\na=source-filter: incl * ")];
     const char *preurl = "\r\nu=", *premail = "\r\ne=", *prephone = "\r\np=";
 
     if (name == NULL)
@@ -102,10 +107,16 @@ char *StartSDP (const char *name, const char *description, const char *url,
 
     if (!IsSDPString (name) || !IsSDPString (description)
      || !IsSDPString (url) || !IsSDPString (email) || !IsSDPString (phone)
-     || (AddressToSDP ((struct sockaddr *)&orig, origlen, machine) == NULL)
-     || (AddressToSDP ((struct sockaddr *)&addr, addrlen, conn) == NULL))
+     || (AddressToSDP ((struct sockaddr *)orig, origlen, machine) == NULL)
+     || (AddressToSDP ((struct sockaddr *)addr, addrlen, conn) == NULL))
         return NULL;
 
+    if (ssm)
+        sprintf (sfilter, "\r\na=source-filter: incl IN IP%c * %s",
+                 machine[5], machine + 7);
+    else
+        *sfilter = '\0';
+
     if (asprintf (&sdp, "v=0"
                     "\r\no=- "I64Fu" "I64Fu" %s"
                     "\r\ns=%s"
@@ -115,7 +126,7 @@ char *StartSDP (const char *name, const char *description, const char *url,
                     "%s%s" // optional phone number
                     "\r\nc=%s"
                         // bandwidth not specified
-                    "\r\nt= 0 0" // one dummy time span
+                    "\r\nt=0 0" // one dummy time span
                         // no repeating
                         // no time zone adjustment (silly idea anyway)
                         // no encryption key (deprecated)
@@ -123,6 +134,7 @@ char *StartSDP (const char *name, const char *description, const char *url,
                     "\r\na=recvonly"
                     "\r\na=type:broadcast"
                     "\r\na=charset:UTF-8"
+                   "%s" // optional source filter
                     "\r\n",
                /* o= */ t, t, machine,
                /* s= */ name,
@@ -130,7 +142,8 @@ char *StartSDP (const char *name, const char *description, const char *url,
                /* u= */ preurl, url,
                /* e= */ premail, email,
                /* p= */ prephone, phone,
-               /* c= */ conn) == -1)
+               /* c= */ conn,
+    /* source-filter */ sfilter) == -1)
         return NULL;
     return sdp;
 }