This fixes errors reported by the -fsanitize=undefined sanitizer. Before accepting the message interval value from a sync message, check if it is between -10 and 22, same as required for the delay request interval.
In the calculation of fest/stats/nrate max_count use unsigned 1 to avoid an invalid shift by 31. In tmv.h operations cast values to uint64_t to avoid signed overflows and a left-shift of a negative value. Signed-off-by: Miroslav Lichvar <mlich...@redhat.com> --- clock.c | 4 ++-- port.c | 12 +++++++++--- tmv.h | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/clock.c b/clock.c index f88df58..85d7667 100644 --- a/clock.c +++ b/clock.c @@ -1881,7 +1881,7 @@ void clock_sync_interval(struct clock *c, int n) shift = sizeof(int) * 8 - 1; pr_warning("freq_est_interval is too long"); } - c->fest.max_count = (1 << shift); + c->fest.max_count = (1U << shift); shift = c->stats_interval - n; if (shift < 0) @@ -1890,7 +1890,7 @@ void clock_sync_interval(struct clock *c, int n) shift = sizeof(int) * 8 - 1; pr_warning("summary_interval is too long"); } - c->stats.max_count = (1 << shift); + c->stats.max_count = (1U << shift); servo_sync_interval(c->servo, n < 0 ? 1.0 / (1 << -n) : 1 << n); } diff --git a/port.c b/port.c index cefe780..da7c327 100644 --- a/port.c +++ b/port.c @@ -1070,7 +1070,7 @@ static void port_nrate_initialize(struct port *p) p->nrate.origin1 = tmv_zero(); p->nrate.ingress1 = tmv_zero(); - p->nrate.max_count = (1 << shift); + p->nrate.max_count = (1U << shift); p->nrate.count = 0; p->nrate.ratio = 1.0; p->nrate.ratio_valid = 0; @@ -2345,8 +2345,14 @@ void process_sync(struct port *p, struct ptp_message *m) if (!msg_unicast(m) && m->header.logMessageInterval != p->log_sync_interval) { - p->log_sync_interval = m->header.logMessageInterval; - clock_sync_interval(p->clock, p->log_sync_interval); + if (m->header.logMessageInterval < -10 || + m->header.logMessageInterval > 22) { + pl_info(300, "%s: ignore bogus sync interval 2^%d", + p->log_name, m->header.logMessageInterval); + } else { + p->log_sync_interval = m->header.logMessageInterval; + clock_sync_interval(p->clock, p->log_sync_interval); + } } m->header.correction += p->asymmetry; diff --git a/tmv.h b/tmv.h index 0c1155f..e5fe110 100644 --- a/tmv.h +++ b/tmv.h @@ -49,7 +49,7 @@ typedef struct { static inline tmv_t tmv_add(tmv_t a, tmv_t b) { tmv_t t; - t.ns = a.ns + b.ns; + t.ns = (uint64_t)a.ns + (uint64_t)b.ns; return t; } @@ -78,7 +78,7 @@ static inline int tmv_is_zero(tmv_t x) static inline tmv_t tmv_sub(tmv_t a, tmv_t b) { tmv_t t; - t.ns = a.ns - b.ns; + t.ns = (uint64_t)a.ns - (uint64_t)b.ns; return t; } @@ -126,7 +126,7 @@ static inline TimeInterval tmv_to_TimeInterval(tmv_t x) } else if (x.ns > (int64_t)MAX_TMV_TO_TIMEINTERVAL) { return MAX_TMV_TO_TIMEINTERVAL << 16; } - return x.ns << 16; + return (uint64_t)x.ns << 16; } static inline struct Timestamp tmv_to_Timestamp(tmv_t x) -- 2.26.2 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel