diff options
author | Doron Roberts-Kedes <doronrk@fb.com> | 2018-04-20 12:11:11 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-04-22 21:09:16 -0400 |
commit | 7c5aba211dd61f41d737a2c51729eb9fdcd3edf4 (patch) | |
tree | 2436a7533654ee8713277f3a736bc6c877333268 /net/strparser | |
parent | a957fa190aa9d9168b33d460a5241a6d088c6265 (diff) | |
download | linux-7c5aba211dd61f41d737a2c51729eb9fdcd3edf4.tar.gz linux-7c5aba211dd61f41d737a2c51729eb9fdcd3edf4.tar.bz2 linux-7c5aba211dd61f41d737a2c51729eb9fdcd3edf4.zip |
strparser: Do not call mod_delayed_work with a timeout of LONG_MAX
struct sock's sk_rcvtimeo is initialized to
LONG_MAX/MAX_SCHEDULE_TIMEOUT in sock_init_data. Calling
mod_delayed_work with a timeout of LONG_MAX causes spurious execution of
the work function. timer->expires is set equal to jiffies + LONG_MAX.
When timer_base->clk falls behind the current value of jiffies,
the delta between timer_base->clk and jiffies + LONG_MAX causes the
expiration to be in the past. Returning early from strp_start_timer if
timeo == LONG_MAX solves this problem.
Found while testing net/tls_sw recv path.
Fixes: 43a0c6751a322847 ("strparser: Stream parser for messages")
Reviewed-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Doron Roberts-Kedes <doronrk@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/strparser')
-rw-r--r-- | net/strparser/strparser.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index 805b139756db..092bebc70048 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c @@ -67,7 +67,7 @@ static void strp_abort_strp(struct strparser *strp, int err) static void strp_start_timer(struct strparser *strp, long timeo) { - if (timeo) + if (timeo && timeo != LONG_MAX) mod_delayed_work(strp_wq, &strp->msg_timer_work, timeo); } |