]> git.sesse.net Git - vlc/blobdiff - src/stream_output/announce.c
net_SetCSCov: sets checksum coverages of a socket
[vlc] / src / stream_output / announce.c
index 376080d41b06ac35215189543e42accc3f01fef4..3bae8026b211407f400cf560412d92e554c87ec9 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <stdlib.h>                                                /* free() */
-#include <stdio.h>                                              /* sprintf() */
-#include <string.h>                                            /* strerror() */
-#include <assert.h>
-
 #include <vlc/vlc.h>
 #include <vlc_sout.h>
-#include <vlc_network.h> /* FIXME: fix RegisterSDP() and remove this */
 #include "stream_output.h"
 
+#include <assert.h>
+
+
 struct announce_method_t
 {
 } sap_method;
@@ -193,28 +190,36 @@ session_descriptor_t * sout_AnnounceSessionCreate (vlc_object_t *obj,
 }
 
 int sout_SessionSetMedia (vlc_object_t *obj, session_descriptor_t *p_session,
-                          char *fmt, char *src, int sport,
-                          char *dst, int dport)
+                          const char *fmt, const char *src, int sport,
+                          const char *dst, int dport)
 {
-    p_session->sdpformat = fmt;
+    if ((p_session->sdpformat = strdup (fmt)) == NULL)
+        return VLC_ENOMEM;
 
     /* GRUIK. We should not convert back-and-forth from string to numbers */
     struct addrinfo *res;
     if (vlc_getaddrinfo (obj, dst, dport, NULL, &res) == 0)
     {
-        if (res->ai_addrlen <= sizeof (p_session->addr))
-            memcpy (&p_session->addr, res->ai_addr,
-                    p_session->addrlen = res->ai_addrlen);
+        if (res->ai_addrlen > sizeof (p_session->addr))
+            goto oflow;
+
+        memcpy (&p_session->addr, res->ai_addr,
+                p_session->addrlen = res->ai_addrlen);
         vlc_freeaddrinfo (res);
     }
     if (vlc_getaddrinfo (obj, src, sport, NULL, &res) == 0)
     {
-        if (res->ai_addrlen <= sizeof (p_session->orig))
-            memcpy (&p_session->orig, res->ai_addr,
-                    p_session->origlen = res->ai_addrlen);
+        if (res->ai_addrlen > sizeof (p_session->orig))
+            goto oflow;
+        memcpy (&p_session->orig, res->ai_addr,
+               p_session->origlen = res->ai_addrlen);
         vlc_freeaddrinfo (res);
     }
     return 0;
+
+oflow:
+    vlc_freeaddrinfo (res);
+    return VLC_ENOMEM;
 }
 
 /**
@@ -231,6 +236,7 @@ void sout_AnnounceSessionDestroy( session_descriptor_t *p_session )
         free (p_session->psz_group);
         free (p_session->psz_sdp);
         free (p_session->description);
+        free (p_session->sdpformat);
         free (p_session->url);
         free (p_session->email);
         free (p_session->phone);
@@ -289,7 +295,7 @@ int announce_HandlerDestroy( announce_handler_t *p_announce )
 {
     if( p_announce->p_sap )
     {
-        ((vlc_object_t *)p_announce->p_sap)->b_die = VLC_TRUE;
+        vlc_object_kill ((vlc_object_t *)p_announce->p_sap);
         /* Wait for the SAP thread to exit */
         vlc_thread_join( (vlc_object_t *)p_announce->p_sap );
         announce_SAPHandlerDestroy( p_announce->p_sap );