Hi On Fri, Jan 22, 2016 at 12:03 AM, John Stultz <[email protected]> wrote: > Recently, in commit 37cf4dc3370f > ("time: Verify time values in adjtimex ADJ_SETOFFSET to avoid overflow") > I forgot to check if the timeval being passed was actually a > timespec (as is signaled with ADJ_NANO). > > This resulted in that patch breaking ADJ_SETOFFSET users who set > ADJ_NANO, by rejecting valid timespecs that were compared with > valid timeval ranges. > > This patch addresses this by checking for the ADJ_NANO flag and > using the timepsec check instead in that case. > > Cc: Sasha Levin <[email protected]> > Cc: Richard Cochran <[email protected]> > Cc: Thomas Gleixner <[email protected]> > Cc: Prarit Bhargava <[email protected]> > Cc: Harald Hoyer <[email protected]> > Cc: Kay Sievers <[email protected]> > Cc: David Herrmann <[email protected]> > Reported-by: Harald Hoyer <[email protected]> > Reported-by: Kay Sievers <[email protected]> > Signed-off-by: John Stultz <[email protected]>
Thanks for picking this up. Looks good to me: Reviewed-by: David Herrmann <[email protected]> Thanks David > --- > kernel/time/ntp.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c > index 36f2ca0..6df8927 100644 > --- a/kernel/time/ntp.c > +++ b/kernel/time/ntp.c > @@ -685,8 +685,18 @@ int ntp_validate_timex(struct timex *txc) > if (!capable(CAP_SYS_TIME)) > return -EPERM; > > - if (!timeval_inject_offset_valid(&txc->time)) > - return -EINVAL; > + if (txc->modes & ADJ_NANO) { > + struct timespec ts; > + > + ts.tv_sec = txc->time.tv_sec; > + ts.tv_nsec = txc->time.tv_usec; > + if (!timespec_inject_offset_valid(&ts)) > + return -EINVAL; > + > + } else { > + if (!timeval_inject_offset_valid(&txc->time)) > + return -EINVAL; > + } > } > > /* > -- > 1.9.1 >

