Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
DVR: a try to make time calculation more robust
  • Loading branch information
perexg committed Mar 4, 2016
1 parent 718d299 commit 055be40
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/dvr/dvr.h
Expand Up @@ -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;
}

/*
Expand Down
17 changes: 10 additions & 7 deletions src/dvr/dvr_db.c
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 *
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/htsp_server.c
Expand Up @@ -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));
Expand Down
9 changes: 9 additions & 0 deletions src/main.c
Expand Up @@ -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();

This comment has been minimized.

Copy link
@Glenn-1990

Glenn-1990 Mar 6, 2016

Contributor

@perexg Why abort here?
This means that entering a retention/removal of 100 days will 'crash' tvheadend on 32-bit machines?

}
12 changes: 12 additions & 0 deletions src/tvheadend.h
Expand Up @@ -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 */

0 comments on commit 055be40

Please sign in to comment.