From: Tristan Madani <[email protected]>

raft_handle_install_snapshot_request__() computes new_log_start as
rq->last_index + 1.  When last_index is UINT64_MAX, new_log_start
wraps to 0, which bypasses the Case 1 and Case 2 early returns
(both compare new_log_start against log_start/log_end and expect
it to be a valid log index).  The function then falls through to
Case 3, setting log_start = log_end = 0 and log_synced to
UINT64_MAX (via log_end - 1), corrupting all subsequent log
index arithmetic.

No valid Raft snapshot can have a last_index of UINT64_MAX, so reject
such requests early.

Fixes: 1b1d2e6daa56 ("ovsdb: Introduce experimental support for clustered 
databases.")
Signed-off-by: Tristan Madani <[email protected]>
---
 ovsdb/raft.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/ovsdb/raft.c b/ovsdb/raft.c
index e50f1f7..23fe3ac 100644
--- a/ovsdb/raft.c
+++ b/ovsdb/raft.c
@@ -4417,6 +4417,11 @@ raft_handle_install_snapshot_request__(
 {
     raft_reset_election_timer(raft);
 
+    /* Reject last_index that would overflow new_log_start computation. */
+    if (rq->last_index == UINT64_MAX) {
+        return false;
+    }
+
     /*
      * Our behavior here depend on new_log_start in the snapshot compared to
      * log_start and log_end.  There are three cases:
-- 
2.53.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to