[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <5fcccfec-cd51-02d5-d096-5a14675c2132@huawei.com>
Date: Mon, 8 Jul 2019 21:33:50 +0800
From: "zhangxiaoxu (A)" <zhangxiaoxu5@...wei.com>
To: Thomas Gleixner <tglx@...utronix.de>
CC: <john.stultz@...aro.org>, <sboyd@...nel.org>,
<linux-kernel@...r.kernel.org>
Subject: Re: [v2] time: Validate the usec before covert to nsec in do_adjtimex
在 2019/7/8 21:04, Thomas Gleixner 写道:
> On Mon, 8 Jul 2019, ZhangXiaoxu wrote:
>
>> When covert the usec to nsec, it will multiple 1000, it maybe
>> overflow and lead an undefined behavior.
>>
>> For example, users may input an negative tv_usec values when
>> call adjtimex syscall, then multiple 1000 maybe overflow it
>> to a positive and legal number.
>>
>> So, we should validate the usec before coverted it to nsec.
>
> Looking deeper before applying it. That change is wrong for two reasons:
>
> 1) The value is already validated in timekeeping_validate_timex()
>
> 2) The tv_usec value can legitimately be >= USEC_PER_SEC if the ADJ_NANO
> mode bit is set. See timekeeping_validate_timex() and the code you
> actually modified:
>
Yes, you are right.
This actually found in an old version, and doesn't check more detail on mainline.
Thank you very much.
>> if (txc->modes & ADJ_SETOFFSET) {
>> struct timespec64 delta;
>> +
>> + if (txc->time.tv_usec < 0 || txc->time.tv_usec >= USEC_PER_SEC)
>> + return -EINVAL;
>> delta.tv_sec = txc->time.tv_sec;
>> delta.tv_nsec = txc->time.tv_usec;
>> if (!(txc->modes & ADJ_NANO))
> delta.tv_nsec *= 1000;
>
> The multiplication is conditional ....
>
> Thanks,
>
> tglx
>
>
>
> .
>
Powered by blists - more mailing lists