浏览代码

ptp: validate the requested frequency adjustment.

PTP Hardware Clock drivers specify a maximum frequency adjustment that
their clocks can accommodate. Normally, user space programs will want to
respect the advertised limits. However, no kernel or driver code checks
that the dialed frequency offset is within the bounds, and out of range
values can lead to surprising results.

This patch fixes the issue by rejecting bad values.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Richard Cochran 11 年之前
父节点
当前提交
d39a743511
共有 1 个文件被更改,包括 4 次插入1 次删除
  1. 4 1
      drivers/ptp/ptp_clock.c

+ 4 - 1
drivers/ptp/ptp_clock.c

@@ -142,7 +142,10 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct timex *tx)
 		delta = ktime_to_ns(kt);
 		delta = ktime_to_ns(kt);
 		err = ops->adjtime(ops, delta);
 		err = ops->adjtime(ops, delta);
 	} else if (tx->modes & ADJ_FREQUENCY) {
 	} else if (tx->modes & ADJ_FREQUENCY) {
-		err = ops->adjfreq(ops, scaled_ppm_to_ppb(tx->freq));
+		s32 ppb = scaled_ppm_to_ppb(tx->freq);
+		if (ppb > ops->max_adj || ppb < -ops->max_adj)
+			return -ERANGE;
+		err = ops->adjfreq(ops, ppb);
 		ptp->dialed_frequency = tx->freq;
 		ptp->dialed_frequency = tx->freq;
 	} else if (tx->modes == 0) {
 	} else if (tx->modes == 0) {
 		tx->freq = ptp->dialed_frequency;
 		tx->freq = ptp->dialed_frequency;