Justin!
On Fri, May 17 2024 at 00:47, Justin Stitt wrote:
> if (txc->modes & ADJ_TIMECONST) {
> - time_constant = txc->constant;
> - if (!(time_status & STA_NANO))
> + if (!(time_status & STA_NANO) && time_constant < MAXTC)
> time_constant += 4;
> time_constant = min(time_constant, (long)MAXTC);
> time_constant = max(time_constant, 0l);
Let me digest this.
The original code does:
time_constant = txc->constant;
if (!(time_status & STA_NANO))
time_constant += 4;
time_constant = min(time_constant, (long)MAXTC);
time_constant = max(time_constant, 0l);
Your change results in:
if (!(time_status & STA_NANO) && time_constant < MAXTC)
time_constant += 4;
time_constant = min(time_constant, (long)MAXTC);
time_constant = max(time_constant, 0l);
IOW, you lost the intent of the code to assign the user space supplied
value of txc->constant.
Aside of that you clearly failed to map the deep analysis I provided to
you vs. the time_maxerror issue to this one:
# git grep 'time_constant.*=' kernel/time/
ntp.c:66:static long time_constant = 2;
That's the static initializer
kernel/time/ntp.c:736: time_constant = txc->constant;
kernel/time/ntp.c:738: time_constant += 4;
kernel/time/ntp.c:739: time_constant = min(time_constant, (long)MAXTC);
kernel/time/ntp.c:740: time_constant = max(time_constant, 0l);
That's the part of process_adjtimex_modes() you are trying to
"fix". So it's exactly the same problem as with time_maxerror, no?
And therefore you provide a "safeguard" against overflow for the price of
making the syscall disfunctional. Seriously?
Did you even try to run something else than the bad case reproducer
against your fix?
No. You did not. Any of the related real use case tests would have
failed.
I told you yesterday:
Tools are good to pin-point symptoms, but they are by definition
patently bad in root cause analysis. Otherwise we could just let the
tool write the "fix".
Such a tool would have at least produced a correct "fix" to cure the
symptom.
Thanks,
tglx