The logMessageInterval field has an improbable range from 2^-128 to 2^127 seconds. The extreme ends cause an integer overflow in the calculation of the "foreign master time window". Buggy or mis-configured foreign masters advertising extreme values will cause incorrect announce message aging.
This patch fixes the issue by adding thresholds for the bogus extremes. Signed-off-by: Richard Cochran <richardcoch...@gmail.com> --- port.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/port.c b/port.c index 3984b78..ef2686d 100644 --- a/port.c +++ b/port.c @@ -163,10 +163,15 @@ static int msg_current(struct ptp_message *m, struct timespec now) t1 = m->ts.host.tv_sec * NSEC2SEC + m->ts.host.tv_nsec; t2 = now.tv_sec * NSEC2SEC + now.tv_nsec; - if (m->header.logMessageInterval < 0) + if (m->header.logMessageInterval < -63) { + tmo = 0; + } else if (m->header.logMessageInterval > 31) { + tmo = INT64_MAX; + } else if (m->header.logMessageInterval < 0) { tmo = 4LL * NSEC2SEC / (1 << -m->header.logMessageInterval); - else + } else { tmo = 4LL * (1 << m->header.logMessageInterval) * NSEC2SEC; + } return t2 - t1 < tmo; } -- 2.1.4 ------------------------------------------------------------------------------ _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel