mirror of
https://github.com/brain-hackers/linux-brain.git
synced 2024-06-09 23:36:23 +09:00
netfilter: nft_meta: use 64-bit time arithmetic
commit 6408c40c39d8eee5caaf97f5219b7dd4e041cc59 upstream.
On 32-bit architectures, get_seconds() returns an unsigned 32-bit
time value, which also matches the type used in the nft_meta
code. This will not overflow in year 2038 as a time_t would, but
it still suffers from the overflow problem later on in year 2106.
Change this instance to use the time64_t type consistently
and avoid the deprecated get_seconds().
The nft_meta_weekday() calculation potentially gets a little slower
on 32-bit architectures, but now it has the same behavior as on
64-bit architectures and does not overflow.
Fixes: 63d10e12b0
("netfilter: nft_meta: support for time matching")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
cf3aabf388
commit
8086a206e0
|
@ -33,19 +33,19 @@
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct rnd_state, nft_prandom_state);
|
static DEFINE_PER_CPU(struct rnd_state, nft_prandom_state);
|
||||||
|
|
||||||
static u8 nft_meta_weekday(unsigned long secs)
|
static u8 nft_meta_weekday(time64_t secs)
|
||||||
{
|
{
|
||||||
unsigned int dse;
|
unsigned int dse;
|
||||||
u8 wday;
|
u8 wday;
|
||||||
|
|
||||||
secs -= NFT_META_SECS_PER_MINUTE * sys_tz.tz_minuteswest;
|
secs -= NFT_META_SECS_PER_MINUTE * sys_tz.tz_minuteswest;
|
||||||
dse = secs / NFT_META_SECS_PER_DAY;
|
dse = div_u64(secs, NFT_META_SECS_PER_DAY);
|
||||||
wday = (4 + dse) % NFT_META_DAYS_PER_WEEK;
|
wday = (4 + dse) % NFT_META_DAYS_PER_WEEK;
|
||||||
|
|
||||||
return wday;
|
return wday;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 nft_meta_hour(unsigned long secs)
|
static u32 nft_meta_hour(time64_t secs)
|
||||||
{
|
{
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
|
@ -250,10 +250,10 @@ void nft_meta_get_eval(const struct nft_expr *expr,
|
||||||
nft_reg_store64(dest, ktime_get_real_ns());
|
nft_reg_store64(dest, ktime_get_real_ns());
|
||||||
break;
|
break;
|
||||||
case NFT_META_TIME_DAY:
|
case NFT_META_TIME_DAY:
|
||||||
nft_reg_store8(dest, nft_meta_weekday(get_seconds()));
|
nft_reg_store8(dest, nft_meta_weekday(ktime_get_real_seconds()));
|
||||||
break;
|
break;
|
||||||
case NFT_META_TIME_HOUR:
|
case NFT_META_TIME_HOUR:
|
||||||
*dest = nft_meta_hour(get_seconds());
|
*dest = nft_meta_hour(ktime_get_real_seconds());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user