[multicat-devel] [Git][videolan/multicat][master] 4 commits: aggregartp: fix potential segfault

Massiot gitlab at videolan.org
Sun Jul 16 17:59:04 CEST 2017


Massiot pushed to branch master at videolan / multicat


Commits:
db9360e6 by Christophe Massiot at 2017-07-16T00:59:58+02:00
aggregartp: fix potential segfault

- - - - -
f83d9aea by Christophe Massiot at 2017-07-16T01:21:35+02:00
reordertp: no retx with multicast inputs

- - - - -
2072c30a by Christophe Massiot at 2017-07-16T17:55:27+02:00
aggregartp: Add support for null weights

- - - - -
14e154f5 by Christophe Massiot at 2017-07-16T17:56:11+02:00
fix make clean

- - - - -


6 changed files:

- Makefile
- NEWS
- aggregartp.c
- reordertp.c
- util.c
- util.h


Changes:

=====================================
Makefile
=====================================
--- a/Makefile
+++ b/Makefile
@@ -50,7 +50,7 @@ multicat_validate: $(OBJ_MULTICAT_VALIDATE)
 	$(CC) -o $@ $(OBJ_MULTICAT_VALIDATE) $(LDLIBS)
 
 clean:
-	-rm -f multicat $(OBJ_MULTICAT) ingests $(OBJ_INGESTS) aggregartp $(OBJ_AGGREGARTP) reordertp $(OBJ_REORDERTP) offsets $(OBJ_OFFSETS) lasts $(OBJ_LASTS) multicat_validate
+	-rm -f multicat $(OBJ_MULTICAT) ingests $(OBJ_INGESTS) aggregartp $(OBJ_AGGREGARTP) reordertp $(OBJ_REORDERTP) offsets $(OBJ_OFFSETS) lasts $(OBJ_LASTS) multicat_validate $(OBJ_MULTICAT_VALIDATE)
 
 install: all
 	@install -d $(BIN)


=====================================
NEWS
=====================================
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,9 @@
+Changes between 2.2 and 2.3:
+----------------------------
+  * Fix potential segfault in aggregartp
+  * Do not do retx in reordertp with multicast inputs
+  * Add support for null weights in aggregartp and reordertp
+
 Changes between 2.1 and 2.2:
 ----------------------------
   * Various portability fixes


=====================================
aggregartp.c
=====================================
--- a/aggregartp.c
+++ b/aggregartp.c
@@ -1,8 +1,7 @@
 /*****************************************************************************
  * aggregartp.c: split an RTP stream for several contribution links
  *****************************************************************************
- * Copyright (C) 2009, 2011, 2014-2015 VideoLAN
- * $Id$
+ * Copyright (C) 2009, 2011, 2014-2017 VideoLAN
  *
  * Authors: Christophe Massiot <massiot at via.ecp.fr>
  *
@@ -87,6 +86,7 @@ static void usage(void)
 {
     msg_Raw( NULL, "Usage: aggregartp [-i <RT priority>] [-l <syslogtag>] [-t <ttl>] [-w] [-o <SSRC IP>] [-U] [-x <retx buffer>] [-X <retx URL>] [-m <payload size>] [-R <RTP header>] @<src host> <dest host 1>[,<weight 1>] ... [<dest host N>,<weight N>]" );
     msg_Raw( NULL, "    host format: [<connect addr>[:<connect port>]][@[<bind addr][:<bind port>]]" );
+    msg_Raw( NULL, "    weight: integer, higher value means more capacity, or 0 for all packets" );
     msg_Raw( NULL, "    -w: overwrite RTP timestamps" );
     msg_Raw( NULL, "    -o: overwrite RTP SSRC" );
     msg_Raw( NULL, "    -U: prepend RTP header" );
@@ -141,6 +141,17 @@ static void SendBlock( int i_fd, struct sockaddr *p_sout,
 }
 
 /*****************************************************************************
+ * SendBlock0: send a block to all outputs with weight 0
+ *****************************************************************************/
+static void SendBlock0( block_t *p_block )
+{
+    int i;
+    for ( i = 0; i < i_nb_outputs; i++ )
+        if ( !p_outputs[i].i_weight )
+            SendBlock( p_outputs[i].i_fd, NULL, 0, p_block);
+}
+
+/*****************************************************************************
  * RetxQueue: store a packet in the retx queue
  *****************************************************************************/
 static void RetxQueue( block_t *p_block, uint64_t i_current_date )
@@ -345,10 +356,15 @@ int main( int i_argc, char **pp_argv )
 
     while ( optind < i_argc )
     {
+        bool b_multicast;
+        struct opensocket_opt opt;
+        memset(&opt, 0, sizeof(struct opensocket_opt));
+        opt.pb_multicast = &b_multicast;
+
         p_outputs = realloc( p_outputs, ++i_nb_outputs * sizeof(output_t) );
         p_outputs[i_nb_outputs - 1].i_fd = i_fd =
             OpenSocket( pp_argv[optind++], i_ttl, 0, DEFAULT_PORT,
-                        &p_outputs[i_nb_outputs - 1].i_weight, NULL, NULL );
+                        &p_outputs[i_nb_outputs - 1].i_weight, NULL, &opt );
         if ( p_outputs[i_nb_outputs - 1].i_fd == -1 )
         {
             msg_Err( NULL, "unable to open output socket" );
@@ -359,13 +375,13 @@ int main( int i_argc, char **pp_argv )
             p_outputs[i_nb_outputs - 1].i_remainder = 0;
         i_max_weight += p_outputs[i_nb_outputs - 1].i_weight;
 
-        if ( i_retx_fd == -1 )
+        if ( i_retx_fd == -1 && !b_multicast )
         {
             ADD_RETX
         }
     }
     msg_Dbg( NULL, "%d outputs weight %u%s", i_nb_outputs, i_max_weight,
-             i_retx_fd != -1 ? ", with retx" : "" );
+             i_nb_retx > 1 ? ", with retx" : "" );
 
     p_retx_block = malloc( sizeof(block_t) + RETX_HEADER_SIZE );
     p_retx_block->p_data = (uint8_t *)p_retx_block + sizeof(block_t);
@@ -389,7 +405,7 @@ int main( int i_argc, char **pp_argv )
     for ( ; ; )
     {
         uint64_t i_current_date;
-        if ( poll( pfd, i_nb_retx + 1, -1 ) < 0 )
+        if ( poll( pfd, i_nb_retx, -1 ) < 0 )
         {
             int saved_errno = errno;
             msg_Warn( NULL, "couldn't poll(): %s", strerror(errno) );
@@ -472,13 +488,18 @@ int main( int i_argc, char **pp_argv )
             }
 
             /* Output block */
-            output_t *p_output = NextOutput();
-            SendBlock( p_output->i_fd, NULL, 0, p_input_block );
+            SendBlock0( p_input_block );
 
-            p_output->i_weighted_size += (i_size + p_output->i_remainder)
-                                           / p_output->i_weight;
-            p_output->i_remainder = (i_size + p_output->i_remainder)
-                                           % p_output->i_weight;
+            if ( i_max_weight )
+            {
+                output_t *p_output = NextOutput();
+                SendBlock( p_output->i_fd, NULL, 0, p_input_block );
+
+                p_output->i_weighted_size += (i_size + p_output->i_remainder)
+                                               / p_output->i_weight;
+                p_output->i_remainder = (i_size + p_output->i_remainder)
+                                               % p_output->i_weight;
+            }
 
             RetxQueue( p_input_block, i_current_date );
             p_input_block = NULL;
@@ -490,11 +511,11 @@ int main( int i_argc, char **pp_argv )
         }
 
         int i;
-        for ( i = 0; i < i_nb_retx; i++ )
+        for ( i = 1; i < i_nb_retx; i++ )
         {
-            if ( pfd[i + 1].revents & POLLIN )
+            if ( pfd[i].revents & POLLIN )
             {
-                RetxHandle( pfd[i + 1].fd );
+                RetxHandle( pfd[i].fd );
             }
         }
     }


=====================================
reordertp.c
=====================================
--- a/reordertp.c
+++ b/reordertp.c
@@ -1,8 +1,7 @@
 /*****************************************************************************
  * reordertp.c: rebuild an RTP stream from several aggregated links
  *****************************************************************************
- * Copyright (C) 2009, 2011, 2014-2015 VideoLAN
- * $Id$
+ * Copyright (C) 2009, 2011, 2014-2017 VideoLAN
  *
  * Authors: Christophe Massiot <massiot at via.ecp.fr>
  *
@@ -72,6 +71,7 @@ typedef struct input_t
 {
     int i_fd;
     bool b_tcp;
+    bool b_multicast;
     block_t *p_block;
     sockaddr_t peer;
 } input_t;
@@ -83,6 +83,7 @@ static int i_output_fd;
 static input_t *p_inputs = NULL;
 static int i_nb_inputs = 0;
 static int b_udp = 0;
+static int b_redundance = 0;
 
 static block_t *p_first = NULL;
 static block_t **pp_retx = NULL;
@@ -114,9 +115,10 @@ static int i_last_retx_input = 0;
 
 static void usage(void)
 {
-    msg_Raw( NULL, "Usage: reordertp [-i <RT priority>] [-l <syslogtag>] [-t <ttl>] [-b <buffer length>] [-U] [-g <max gap>] [-j <max jitter>] [-r <# of clock ref>] [-n <max retx burst>] [-x <reorder/retx delay>] [-X <retx URL>] [-m <payload size>] [-R <RTP header>] <src host 1> ... [<src host N>] <dest host>" );
+    msg_Raw( NULL, "Usage: reordertp [-i <RT priority>] [-l <syslogtag>] [-t <ttl>] [-b <buffer length>] [-U] [-D] [-g <max gap>] [-j <max jitter>] [-r <# of clock ref>] [-n <max retx burst>] [-x <reorder/retx delay>] [-X <retx URL>] [-m <payload size>] [-R <RTP header>] <src host 1> ... [<src host N>] <dest host>" );
     msg_Raw( NULL, "    host format: [<connect addr>[:<connect port>]][@[<bind addr][:<bind port>]]" );
     msg_Raw( NULL, "    -U: strip RTP header" );
+    msg_Raw( NULL, "    -D: input has redundant packets" );
     msg_Raw( NULL, "    -b: buffer length in ms [default 400]" );
     msg_Raw( NULL, "    -g: max gap between two clock references in ms [default 300]" );
     msg_Raw( NULL, "    -j: max jitter in ms [default 150]" );
@@ -241,7 +243,8 @@ static int RetxGetFd(sockaddr_t **pp_sockaddr)
         i_nb_tries++;
         i_last_retx_input++;
         i_last_retx_input %= i_nb_inputs;
-        if ( p_inputs[i_last_retx_input].peer.so.sa_family != AF_UNSPEC )
+        if ( p_inputs[i_last_retx_input].peer.so.sa_family != AF_UNSPEC &&
+             !p_inputs[i_last_retx_input].b_multicast )
             break;
     }
 
@@ -281,7 +284,9 @@ static void RetxCheck( uint64_t i_current_date )
 
             if ( i_current_seqnum == i_prev_seqnum )
             {
-                msg_Dbg( NULL, "duplicate RTP packet %hu", i_current_seqnum );
+                if ( !b_redundance )
+                    msg_Dbg( NULL, "duplicate RTP packet %hu",
+                             i_current_seqnum );
                 RetxDereference( p_current );
                 free( p_current );
                 continue;
@@ -445,18 +450,20 @@ int main( int i_argc, char **pp_argv )
     struct pollfd *pfd = NULL;
     int i_fd;
     bool b_tcp;
+    bool b_multicast = false;
 
 #define ADD_INPUT                                                           \
     p_inputs = realloc( p_inputs, ++i_nb_inputs * sizeof(input_t) );        \
     p_inputs[i_nb_inputs - 1].i_fd = i_fd;                                  \
     p_inputs[i_nb_inputs - 1].b_tcp = b_tcp;                                \
+    p_inputs[i_nb_inputs - 1].b_multicast = b_multicast;                    \
     p_inputs[i_nb_inputs - 1].p_block = NULL;                               \
     p_inputs[i_nb_inputs - 1].peer.so.sa_family = AF_UNSPEC;                \
     pfd = realloc( pfd, i_nb_inputs * sizeof(struct pollfd) );              \
     pfd[i_nb_inputs - 1].fd = i_fd;                                         \
     pfd[i_nb_inputs - 1].events = POLLIN | POLLERR | POLLRDHUP | POLLHUP;
 
-    while ( (c = getopt( i_argc, pp_argv, "i:l:t:b:g:j:r:n:x:X:Um:R:h" )) != -1 )
+    while ( (c = getopt( i_argc, pp_argv, "i:l:t:b:g:j:r:n:x:X:UDm:R:h" )) != -1 )
     {
         switch ( c )
         {
@@ -511,6 +518,10 @@ int main( int i_argc, char **pp_argv )
             b_udp = 1;
             break;
 
+        case 'D':
+            b_redundance = 1;
+            break;
+
         case 'm':
             i_asked_payload_size = strtol( optarg, NULL, 0 );
             break;
@@ -533,8 +544,12 @@ int main( int i_argc, char **pp_argv )
 
     while ( optind < i_argc - 1 )
     {
+        struct opensocket_opt opt;
+        memset(&opt, 0, sizeof(struct opensocket_opt));
+        opt.pb_multicast = &b_multicast;
+
         i_fd = OpenSocket( pp_argv[optind], 0, DEFAULT_PORT, 0, NULL,
-                           &b_tcp, NULL );
+                           &b_tcp, &opt );
         if ( i_fd == -1 )
         {
             msg_Err( NULL, "unable to open input %s\n", pp_argv[optind] );


=====================================
util.c
=====================================
--- a/util.c
+++ b/util.c
@@ -555,7 +555,7 @@ int OpenSocket( const char *_psz_arg, int i_ttl, uint16_t i_bind_port,
     socklen_t i_sockaddr_len;
     bool b_host = false;
     bool b_raw_packets = false;
-    in_addr_t i_raw_srcaddr = INADDR_ANY; 
+    in_addr_t i_raw_srcaddr = INADDR_ANY;
     int i_raw_srcport = 0;
     char *psz_ifname = NULL;
 #ifdef __FreeBSD__
@@ -569,6 +569,9 @@ int OpenSocket( const char *_psz_arg, int i_ttl, uint16_t i_bind_port,
         pb_tcp = &b_tcp;
     *pb_tcp = false;
 
+    if ( p_opt != NULL && p_opt->pb_multicast != NULL )
+        *p_opt->pb_multicast = false;
+
     psz_token2 = strrchr( psz_arg, ',' );
     if ( psz_token2 )
     {
@@ -780,6 +783,9 @@ int OpenSocket( const char *_psz_arg, int i_ttl, uint16_t i_bind_port,
                                       &connect_addr );
                         exit(EXIT_FAILURE);
                     }
+
+                    if ( p_opt != NULL && p_opt->pb_multicast != NULL )
+                        *p_opt->pb_multicast = true;
                 }
                 else
                 #endif
@@ -882,6 +888,9 @@ normal_bind:
             }
 #endif
         }
+
+        if ( p_opt != NULL && p_opt->pb_multicast != NULL )
+            *p_opt->pb_multicast = true;
     }
 
     if ( connect_addr.ss.ss_family != AF_UNSPEC )


=====================================
util.h
=====================================
--- a/util.h
+++ b/util.h
@@ -76,6 +76,7 @@ struct udprawpkt {
  *****************************************************************************/
  struct opensocket_opt {
     struct udprawpkt *p_raw_pktheader;
+    bool *pb_multicast;
  };
 
 



View it on GitLab: https://code.videolan.org/videolan/multicat/compare/0a8b069f892b0cd9d52ab913a2c77cad0f6bede6...14e154f5cb719863314644a794e7a9d1ceb0c848

---
View it on GitLab: https://code.videolan.org/videolan/multicat/compare/0a8b069f892b0cd9d52ab913a2c77cad0f6bede6...14e154f5cb719863314644a794e7a9d1ceb0c848
You're receiving this email because of your account on code.videolan.org.


More information about the multicat-devel mailing list