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 calculation of the fest/stats/nrate max_count use unsigned 1 to avoid
an invalid shift by 31.

Signed-off-by: Miroslav Lichvar <mlich...@redhat.com>
---
 clock.c |  4 ++--
 port.c  | 12 +++++++++---
 2 files changed, 11 insertions(+), 5 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;
-- 
2.26.2



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to