From 31a0ffb5dcbd753dbc54a3569f50680b10b86456 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 14 Mar 2014 21:01:49 +0100 Subject: [PATCH 1/3] Fix some memory leaks in parse_avc.c and mkmux.c --- src/htsbuf.c | 9 +++++++++ src/htsbuf.h | 2 ++ src/muxer/muxer_tvh.c | 2 +- src/muxer/tvh/mkmux.c | 15 +++++++++++---- src/parsers/parser_avc.c | 18 +++++++++++++----- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/htsbuf.c b/src/htsbuf.c index 045fa071..f1b9bbae 100644 --- a/src/htsbuf.c +++ b/src/htsbuf.c @@ -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); +} /** * diff --git a/src/htsbuf.h b/src/htsbuf.h index ae9a1322..b355ce1f 100644 --- a/src/htsbuf.h +++ b/src/htsbuf.h @@ -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); diff --git a/src/muxer/muxer_tvh.c b/src/muxer/muxer_tvh.c index 1049c847..cffc9069 100644 --- a/src/muxer/muxer_tvh.c +++ b/src/muxer/muxer_tvh.c @@ -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); } diff --git a/src/muxer/tvh/mkmux.c b/src/muxer/tvh/mkmux.c index 4925039d..4c9366c4 100644 --- a/src/muxer/tvh/mkmux.c +++ b/src/muxer/tvh/mkmux.c @@ -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); diff --git a/src/parsers/parser_avc.c b/src/parsers/parser_avc.c index 1093dcab..54a08917 100644 --- a/src/parsers/parser_avc.c +++ b/src/parsers/parser_avc.c @@ -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 Date: Fri, 14 Mar 2014 18:19:44 +0100 Subject: [PATCH 2/3] Fix another leaks in htsp_server.c (_very_ _VERY_ _BAD_) --- src/htsp_server.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/htsp_server.c b/src/htsp_server.c index 60886eef..a2cd7829 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -2359,6 +2359,7 @@ _htsp_channel_update(channel_t *ch, const char *method, htsmsg_t *msg) htsp_send_message(htsp, m, NULL); } } + htsmsg_destroy(msg); } /** @@ -2459,6 +2460,7 @@ _htsp_dvr_entry_update(dvr_entry_t *de, const char *method, htsmsg_t *msg) htsp_send_message(htsp, m, NULL); } } + htsmsg_destroy(msg); } /** @@ -2509,6 +2511,7 @@ _htsp_event_update(epg_broadcast_t *ebc, const char *method, htsmsg_t *msg) htsp_send_message(htsp, m, NULL); } } + htsmsg_destroy(msg); } /** From 1e11bc8c19f77625eaa5e59391a8f82d9278e81c Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 14 Mar 2014 20:07:38 +0100 Subject: [PATCH 3/3] Fix the subscription_done() call The subscription_unsubscribe() must be called from the upper layer (like dvr). --- src/main.c | 2 +- src/subscriptions.c | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index 4216fee2..c419af2a 100644 --- a/src/main.c +++ b/src/main.c @@ -854,12 +854,12 @@ main(int argc, char **argv) tvhftrace("main", epggrab_done); tvhftrace("main", tcp_server_done); - tvhftrace("main", subscription_done); tvhftrace("main", descrambler_done); tvhftrace("main", service_mapper_done); tvhftrace("main", service_done); tvhftrace("main", channel_done); tvhftrace("main", dvr_done); + tvhftrace("main", subscription_done); tvhftrace("main", access_done); tvhftrace("main", epg_done); tvhftrace("main", avahi_done); diff --git a/src/subscriptions.c b/src/subscriptions.c index ebb6e2f3..94193084 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -763,12 +763,7 @@ subscription_init(void) void subscription_done(void) { - th_subscription_t *s; - - pthread_mutex_lock(&global_lock); - while ((s = LIST_FIRST(&subscriptions)) != NULL) - subscription_unsubscribe(s); - pthread_mutex_unlock(&global_lock); + assert(LIST_FIRST(&subscriptions) == NULL); } /* **************************************************************************