xfrm: use time64_t for in-kernel timestamps
The lifetime managment uses '__u64' timestamps on the user space interface, but 'unsigned long' for reading the current time in the kernel with get_seconds(). While this is probably safe beyond y2038, it will still overflow in 2106, and the get_seconds() call is deprecated because fo that. This changes the xfrm time handling to use time64_t consistently, along with reading the time using the safer ktime_get_real_seconds(). It still suffers from problems that can happen from a concurrent settimeofday() call or (to a lesser degree) a leap second update, but since the time stamps are part of the user API, there is nothing we can do to prevent that. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:

committed by
Steffen Klassert

parent
6d8e85ffe1
commit
386c5680e2
@@ -475,8 +475,8 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer *me)
|
||||
{
|
||||
struct tasklet_hrtimer *thr = container_of(me, struct tasklet_hrtimer, timer);
|
||||
struct xfrm_state *x = container_of(thr, struct xfrm_state, mtimer);
|
||||
unsigned long now = get_seconds();
|
||||
long next = LONG_MAX;
|
||||
time64_t now = ktime_get_real_seconds();
|
||||
time64_t next = TIME64_MAX;
|
||||
int warn = 0;
|
||||
int err = 0;
|
||||
|
||||
@@ -537,7 +537,7 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer *me)
|
||||
if (warn)
|
||||
km_state_expired(x, 0, 0);
|
||||
resched:
|
||||
if (next != LONG_MAX) {
|
||||
if (next != TIME64_MAX) {
|
||||
tasklet_hrtimer_start(&x->mtimer, ktime_set(next, 0), HRTIMER_MODE_REL);
|
||||
}
|
||||
|
||||
@@ -577,7 +577,7 @@ struct xfrm_state *xfrm_state_alloc(struct net *net)
|
||||
tasklet_hrtimer_init(&x->mtimer, xfrm_timer_handler,
|
||||
CLOCK_BOOTTIME, HRTIMER_MODE_ABS);
|
||||
timer_setup(&x->rtimer, xfrm_replay_timer_handler, 0);
|
||||
x->curlft.add_time = get_seconds();
|
||||
x->curlft.add_time = ktime_get_real_seconds();
|
||||
x->lft.soft_byte_limit = XFRM_INF;
|
||||
x->lft.soft_packet_limit = XFRM_INF;
|
||||
x->lft.hard_byte_limit = XFRM_INF;
|
||||
@@ -1588,7 +1588,7 @@ EXPORT_SYMBOL(xfrm_state_update);
|
||||
int xfrm_state_check_expire(struct xfrm_state *x)
|
||||
{
|
||||
if (!x->curlft.use_time)
|
||||
x->curlft.use_time = get_seconds();
|
||||
x->curlft.use_time = ktime_get_real_seconds();
|
||||
|
||||
if (x->curlft.bytes >= x->lft.hard_byte_limit ||
|
||||
x->curlft.packets >= x->lft.hard_packet_limit) {
|
||||
|
Reference in New Issue
Block a user