From: Jaroslav Kysela Date: Fri, 8 Jan 2016 08:28:15 +0000 (+0100) Subject: DVR: fix the wrong dvr entry access (deferred destroy in retention code) X-Git-Tag: v4.2.1~1195 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b48f6b0d48ef98888675f7b2769ac16daf779b3;p=thirdparty%2Ftvheadend.git DVR: fix the wrong dvr entry access (deferred destroy in retention code) - coverity fix --- diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 61f6499dc..fbc87d434 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -164,6 +164,7 @@ typedef struct dvr_entry { char *de_channel_name; gtimer_t de_timer; + gtimer_t de_deferred_timer; /** * These meta fields will stay valid as long as reference count > 0 diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 09a314d4b..e4b844ecf 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -42,6 +42,7 @@ static int dvr_in_init; static gtimer_t dvr_dbus_timer; #endif +static void dvr_entry_deferred_destroy(dvr_entry_t *de); static void dvr_entry_set_timer(dvr_entry_t *de); static void dvr_timer_rerecord(void *aux); static void dvr_timer_expire(void *aux); @@ -403,9 +404,9 @@ dvr_entry_retention_timer(dvr_entry_t *de) } save = 0; if (dvr_get_filename(de)) - save = dvr_entry_delete(de); // delete actual file + save = dvr_entry_delete(de); // delete actual file if (retention == DVR_RET_ONREMOVE) { - dvr_entry_destroy(de, 1); // also remove database entry + dvr_entry_deferred_destroy(de); // also remove database entry return; } if (save) @@ -1334,6 +1335,7 @@ dvr_entry_destroy(dvr_entry_t *de, int delconf) #endif gtimer_disarm(&de->de_timer); + gtimer_disarm(&de->de_deferred_timer); #if ENABLE_DBUS_1 gtimer_arm(&dvr_dbus_timer, dvr_dbus_timer_cb, NULL, 2); #endif @@ -1351,6 +1353,20 @@ dvr_entry_destroy(dvr_entry_t *de, int delconf) dvr_entry_dec_ref(de); } +/** + * + */ +static void _deferred_destroy_cb(void *aux) +{ + dvr_entry_destroy(aux, 1); +} + +static void +dvr_entry_deferred_destroy(dvr_entry_t *de) +{ + gtimer_arm(&de->de_deferred_timer, _deferred_destroy_cb, de, 0); +} + /** * */ diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index c4fd86f4a..d66e176d0 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -429,7 +429,7 @@ atsc_get_string src += 3; srclen -= 3; - + if (bytecount > srclen) return ls;