diff options
Diffstat (limited to 'include/linux/time.h')
| -rw-r--r-- | include/linux/time.h | 29 | 
1 files changed, 27 insertions, 2 deletions
diff --git a/include/linux/time.h b/include/linux/time.h index c81c5e40fcb..b51e664c83e 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -107,11 +107,36 @@ static inline struct timespec timespec_sub(struct timespec lhs,  	return ts_delta;  } +#define KTIME_MAX			((s64)~((u64)1 << 63)) +#if (BITS_PER_LONG == 64) +# define KTIME_SEC_MAX			(KTIME_MAX / NSEC_PER_SEC) +#else +# define KTIME_SEC_MAX			LONG_MAX +#endif +  /*   * Returns true if the timespec is norm, false if denorm:   */ -#define timespec_valid(ts) \ -	(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) +static inline bool timespec_valid(const struct timespec *ts) +{ +	/* Dates before 1970 are bogus */ +	if (ts->tv_sec < 0) +		return false; +	/* Can't have more nanoseconds then a second */ +	if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) +		return false; +	return true; +} + +static inline bool timespec_valid_strict(const struct timespec *ts) +{ +	if (!timespec_valid(ts)) +		return false; +	/* Disallow values that could overflow ktime_t */ +	if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX) +		return false; +	return true; +}  extern void read_persistent_clock(struct timespec *ts);  extern void read_boot_clock(struct timespec *ts);  |