time: Avoid possible NTP adjustment mult overflow.
authorpang.xunlei <pang.xunlei@linaro.org>
Wed, 8 Oct 2014 07:03:34 +0000 (15:03 +0800)
committerJohn Stultz <john.stultz@linaro.org>
Fri, 21 Nov 2014 19:59:56 +0000 (11:59 -0800)
commit6067dc5a8c2b1b57e67eaf1125db1d63c1ed6361
treefc089bc25bc69fa089146f163f3aa9383c71b879
parentfd866e2b116b01d42428491899fe9925c42c121c
time: Avoid possible NTP adjustment mult overflow.

Ideally, __clocksource_updatefreq_scale, selects the largest shift
value possible for a clocksource. This results in the mult memember of
struct clocksource being particularly large, although not so large
that NTP would adjust the clock to cause it to overflow.

That said, nothing actually prohibits an overflow from occuring, its
just that it "shouldn't" occur.

So while very unlikely, and so far never observed, the value of
(cs->mult+cs->maxadj) may have a chance to reach very near 0xFFFFFFFF,
so there is a possibility it may overflow when doing NTP positive
adjustment

See the following detail: When NTP slewes the clock, kernel goes
through update_wall_time()->...->timekeeping_apply_adjustment():
tk->tkr.mult += mult_adj;

Since there is no guard against it, its possible tk->tkr.mult may
overflow during this operation.

This patch avoids any possible mult overflow by judging the overflow
case before adding mult_adj to mult, also adds the WARNING message
when capturing such case.

Signed-off-by: pang.xunlei <pang.xunlei@linaro.org>
[jstultz: Reworded commit message]
Signed-off-by: John Stultz <john.stultz@linaro.org>
kernel/time/timekeeping.c