diff options
| -rw-r--r-- | kernel/time/ntp.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 4b585e0fdd22..0f60b08a4f07 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
| @@ -633,10 +633,14 @@ int ntp_validate_timex(struct timex *txc) | |||
| 633 | if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME))) | 633 | if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME))) |
| 634 | return -EPERM; | 634 | return -EPERM; |
| 635 | 635 | ||
| 636 | if (txc->modes & ADJ_FREQUENCY) { | 636 | /* |
| 637 | if (LONG_MIN / PPM_SCALE > txc->freq) | 637 | * Check for potential multiplication overflows that can |
| 638 | * only happen on 64-bit systems: | ||
| 639 | */ | ||
| 640 | if ((txc->modes & ADJ_FREQUENCY) && (BITS_PER_LONG == 64)) { | ||
| 641 | if (LLONG_MIN / PPM_SCALE > txc->freq) | ||
| 638 | return -EINVAL; | 642 | return -EINVAL; |
| 639 | if (LONG_MAX / PPM_SCALE < txc->freq) | 643 | if (LLONG_MAX / PPM_SCALE < txc->freq) |
| 640 | return -EINVAL; | 644 | return -EINVAL; |
| 641 | } | 645 | } |
| 642 | 646 | ||
