]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: a try to make time calculation more robust
authorJaroslav Kysela <perex@perex.cz>
Fri, 4 Mar 2016 08:42:44 +0000 (09:42 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 4 Mar 2016 08:42:44 +0000 (09:42 +0100)
src/dvr/dvr.h
src/dvr/dvr_db.c
src/htsp_server.c
src/main.c
src/tvheadend.h

index 7be02c34df371b6215867bf6be0cff392fd461db..36c859c03d509b71bb2c09828b1b32d84f4289c5 100644 (file)
@@ -444,7 +444,7 @@ void dvr_config_destroy_by_profile(profile_t *pro, int delconf);
 
 static inline uint32_t dvr_retention_cleanup(uint32_t val)
 {
-  return (val > 0xffffffff - 86400) ? (0xffffffff - 86400) : val;
+  return val > DVR_RET_FOREVER ? DVR_RET_FOREVER : val;
 }
 
 /*
index 0c07eb13d87fbb1b31835bf7c3cc4f785b5ec767..1ab28eccccc78aed3fd7c97f222b1856c043ac5f 100644 (file)
@@ -214,14 +214,17 @@ dvr_entry_warm_time( dvr_entry_t *de )
 time_t
 dvr_entry_get_start_time( dvr_entry_t *de, int warm )
 {
-  return de->de_start - (60 * dvr_entry_get_extra_time_pre(de)) -
-         (warm ? dvr_entry_warm_time(de) : 0);
+  int64_t b = (dvr_entry_get_extra_time_pre(de)) -
+              (warm ? dvr_entry_warm_time(de) : 0);
+  if (de->de_start < b)
+    return 0;
+  return de->de_start - b;
 }
 
 time_t
 dvr_entry_get_stop_time( dvr_entry_t *de )
 {
-  return de->de_stop + (60 * dvr_entry_get_extra_time_post(de));
+  return time_t_out_of_range((int64_t)de->de_stop + dvr_entry_get_extra_time_post(de));
 }
 
 time_t
@@ -237,7 +240,7 @@ dvr_entry_get_extra_time_pre( dvr_entry_t *de )
     if (!extra_valid(extra))
       extra = de->de_config->dvr_extra_time_pre;
   }
-  return extra;
+  return MINMAX(extra, 0, 24*60) * 60;
 }
 
 time_t
@@ -253,7 +256,7 @@ dvr_entry_get_extra_time_post( dvr_entry_t *de )
     if (!extra_valid(extra))
       extra = de->de_config->dvr_extra_time_post;
   }
-  return extra;
+  return MINMAX(extra, 0, 24*60) * 60;
 }
 
 char *
@@ -396,7 +399,7 @@ dvr_entry_retention_timer(dvr_entry_t *de)
   uint32_t retention = dvr_entry_get_retention_days(de);
   int save;
 
-  stop = de->de_stop + removal * (time_t)86400;
+  stop = time_t_out_of_range((int64_t)de->de_stop + removal * (int64_t)86400);
   if ((removal > 0 || retention == 0) && removal < DVR_RET_SPACE) {
     if (stop > dispatch_clock) {
       dvr_entry_retention_arm(de, dvr_timer_remove_files, stop);
@@ -414,7 +417,7 @@ dvr_entry_retention_timer(dvr_entry_t *de)
   }
 
   if (retention < DVR_RET_ONREMOVE) {
-    stop = de->de_stop + retention * (time_t)86400;
+    stop = time_t_out_of_range((int64_t)de->de_stop + retention * (int64_t)86400);
     dvr_entry_retention_arm(de, dvr_timer_expire, stop);
   } else {
     gtimer_disarm(&de->de_timer);
index e4c8b6466182cf376a57319ff3f6d2547f1b865c..fa1e1b43de5acf83ab500ae4bb74a176218556cd 100644 (file)
@@ -905,8 +905,8 @@ htsp_build_dvrentry(htsp_connection_t *htsp, dvr_entry_t *de, const char *method
 
   htsmsg_add_s64(out, "start",       de->de_start);
   htsmsg_add_s64(out, "stop",        de->de_stop);
-  htsmsg_add_s64(out, "startExtra",  dvr_entry_get_extra_time_pre(de));
-  htsmsg_add_s64(out, "stopExtra",   dvr_entry_get_extra_time_post(de));
+  htsmsg_add_s64(out, "startExtra",  dvr_entry_get_extra_time_pre(de)/60);
+  htsmsg_add_s64(out, "stopExtra",   dvr_entry_get_extra_time_post(de)/60);
 
   if (htsp->htsp_version > 24)
     htsmsg_add_u32(out, "retention",   dvr_entry_get_retention_days(de));
index acf34b8cad692998dee508a1a957d58466cee940..339e084f846bf43d62b174eefd7e64b2f967293f 100644 (file)
@@ -1260,3 +1260,12 @@ htsmsg_t *tvheadend_capabilities_list(int check)
   }
   return r;
 }
+
+/**
+ *
+ */
+void time_t_out_of_range_notify(int64_t val)
+{
+  tvherror("main", "time value of of range (%"PRId64") of time_t", val);
+  abort();
+}
index 1f158bdfbe88f4532183c35acc63bc8441348eff..c739b2e6825807e7f0d1a92a8bf589d82aff1950 100644 (file)
@@ -842,4 +842,16 @@ void tvh_qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void
 #define PRItime_t       "ld"
 #endif
 
+void time_t_out_of_range_notify(int64_t val);
+
+static inline time_t time_t_out_of_range(uint64_t val)
+{
+  time_t r = val;
+  if ((int64_t)r != val) {
+    time_t_out_of_range_notify(val);
+    r = INT32_MAX;
+  }
+  return r;
+}
+
 #endif /* TVHEADEND_H */