]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Fix some memory leaks in parse_avc.c and mkmux.c
authorJaroslav Kysela <perex@perex.cz>
Fri, 14 Mar 2014 20:01:49 +0000 (21:01 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 14 Mar 2014 20:04:15 +0000 (21:04 +0100)
src/htsbuf.c
src/htsbuf.h
src/muxer/muxer_tvh.c
src/muxer/tvh/mkmux.c
src/parsers/parser_avc.c

index 045fa07176db57781e717d4da034251c3cb65839..f1b9bbae6f3942aac7389750516c380ed5a8e854 100644 (file)
@@ -51,6 +51,15 @@ htsbuf_queue_alloc(unsigned int maxsize)
   return hq;
 }
 
+/**
+ *
+ */
+void
+htsbuf_queue_free(htsbuf_queue_t *hq)
+{
+  htsbuf_queue_flush(hq);
+  free(hq);
+}
 
 /**
  *
index ae9a1322b135d334ae3aa5569e6b99430f43ef2c..b355ce1f0c4c04183b6d041e244c625cbb0f7d4a 100644 (file)
@@ -45,6 +45,8 @@ void htsbuf_queue_init(htsbuf_queue_t *hq, unsigned int maxsize);
 
 htsbuf_queue_t *htsbuf_queue_alloc(unsigned int maxsize);
 
+void htsbuf_queue_free(htsbuf_queue_t *hq);
+
 void htsbuf_queue_flush(htsbuf_queue_t *hq);
 
 void htsbuf_vqprintf(htsbuf_queue_t *hq, const char *fmt, va_list ap);
index 1049c847c9813156eb65e2b4ccc2b5667a98b304..cffc906953ecd05cf6d49cf3082dad179ab2a945 100644 (file)
@@ -210,7 +210,7 @@ tvh_muxer_destroy(muxer_t *m)
   tvh_muxer_t *tm = (tvh_muxer_t*)m;
 
   if(tm->tm_ref)
-    free(tm->tm_ref);
+    mk_mux_destroy(tm->tm_ref);
 
   free(tm);
 }
index 4925039d8e15ac9f8ea62b047a655ae505a77c6e..4c9366c4556978607663ae861b2cfe909cd761de 100644 (file)
@@ -514,7 +514,10 @@ mk_build_segment_header(int64_t size)
 static void
 mk_write_segment_header(mk_mux_t *mkm, int64_t size)
 {
-  mk_write_queue(mkm, mk_build_segment_header(size));
+  htsbuf_queue_t *q;
+  q = mk_build_segment_header(size);
+  mk_write_queue(mkm, q);
+  htsbuf_queue_free(q);
 }
 
 
@@ -1064,7 +1067,7 @@ mk_mux_open_file(mk_mux_t *mkm, const char *filename)
 int
 mk_mux_init(mk_mux_t *mkm, const char *title, const streaming_start_t *ss)
 {
-  htsbuf_queue_t q;
+  htsbuf_queue_t q, *a;
 
   getuuid(mkm->uuid);
 
@@ -1081,10 +1084,14 @@ mk_mux_init(mk_mux_t *mkm, const char *title, const streaming_start_t *ss)
   ebml_append_master(&q, 0x1a45dfa3, mk_build_ebmlheader(mkm));
   
   mkm->segment_header_pos = q.hq_size;
-  htsbuf_appendq(&q, mk_build_segment_header(0));
+  a = mk_build_segment_header(0);
+  htsbuf_appendq(&q, a);
+  htsbuf_queue_free(a);
 
   mkm->segment_pos = q.hq_size;
-  htsbuf_appendq(&q, mk_build_segment(mkm, ss));
+  a = mk_build_segment(mkm, ss);
+  htsbuf_appendq(&q, a);
+  htsbuf_queue_free(a);
  
   mk_write_queue(mkm, &q);
 
index 1093dcab6a8b6e3b728e238174491c0071518935..54a08917aac7ee3a92e50cb0dea569c2a85e02f3 100644 (file)
@@ -27,7 +27,7 @@ avc_find_startcode(const uint8_t *p, const uint8_t *end)
   int i;
        
   uint32_t sc=0xFFFFFFFF;
-  size_t len = (end -p)+1;
+  size_t len = end - p;
   for (i=0;i<len;i++)
     {
       sc = (sc <<8) | p[i];
@@ -138,10 +138,14 @@ isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len)
       }
       if(!sps_count || !pps_count) {
        free(start);
-       if (sps_count)
+       if (sps_count) {
          free(sps_array);
-       if (pps_count)
+          free(sps_size_array);
+        }
+       if (pps_count) {
          free(pps_array);
+          free(pps_size_array);
+        }
        return -1;
       }
 
@@ -163,10 +167,14 @@ isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len)
       }
       free(start);
 
-      if (sps_count)
+      if (sps_count) {
        free(sps_array);
-      if (pps_count)
+        free(sps_size_array);
+      }
+      if (pps_count) {
        free(pps_array);
+        free(pps_size_array);
+      }
     } else {
       sbuf_append(sb, data, len);
     }