From: Jaroslav Kysela Date: Fri, 4 Mar 2016 08:42:44 +0000 (+0100) Subject: DVR: a try to make time calculation more robust X-Git-Tag: v4.2.1~967 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=055be40c0c3dffae117f1be2ce22885eb819f02c;p=thirdparty%2Ftvheadend.git DVR: a try to make time calculation more robust --- diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 7be02c34d..36c859c03 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -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; } /* diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 0c07eb13d..1ab28eccc 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -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); diff --git a/src/htsp_server.c b/src/htsp_server.c index e4c8b6466..fa1e1b43d 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -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)); diff --git a/src/main.c b/src/main.c index acf34b8ca..339e084f8 100644 --- a/src/main.c +++ b/src/main.c @@ -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(); +} diff --git a/src/tvheadend.h b/src/tvheadend.h index 1f158bdfb..c739b2e68 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -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 */