X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fstream_output%2Fsdp.c;h=d49a92afb0519fb6d394830a125a566cb84ab889;hb=02859f76a72ee583ed6d77953b0651e8364504b7;hp=38c32ff3f3b5eea4fb1baba353c5376fea4b765d;hpb=08cb8e62e928457d00602f9b96cb8c4755a74305;p=vlc diff --git a/src/stream_output/sdp.c b/src/stream_output/sdp.c index 38c32ff3f3..d49a92afb0 100644 --- a/src/stream_output/sdp.c +++ b/src/stream_output/sdp.c @@ -34,6 +34,10 @@ 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; }