]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: fix the wrong dvr entry access (deferred destroy in retention code)
authorJaroslav Kysela <perex@perex.cz>
Fri, 8 Jan 2016 08:28:15 +0000 (09:28 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 8 Jan 2016 08:28:21 +0000 (09:28 +0100)
- coverity fix

src/dvr/dvr.h
src/dvr/dvr_db.c
src/input/mpegts/dvb_support.c

index 61f6499dcad187ba5779eeae7416356c604fd5e1..fbc87d434a3abef2bdddf0d44a733f47f2629f86 100644 (file)
@@ -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
index 09a314d4ba2fbc22fab09c17cd002c3b333ee6fe..e4b844ecfb6ef5b83e967220f84e59427d464ba5 100644 (file)
@@ -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);
+}
+
 /**
  *
  */
index c4fd86f4a7e82f27c925edb05eca3a095c4df23a..d66e176d0125a8d0b796e6723dbb05952d3c77c3 100644 (file)
@@ -429,7 +429,7 @@ atsc_get_string
 
       src    += 3;
       srclen -= 3;
-      
+
       if (bytecount > srclen)
         return ls;