fib: make sure adj is valid during walk 42/32642/2
authorBenoît Ganne <bganne@cisco.com>
Tue, 8 Jun 2021 14:25:14 +0000 (16:25 +0200)
committerBeno�t Ganne <bganne@cisco.com>
Tue, 8 Jun 2021 16:44:19 +0000 (16:44 +0000)
The adj can be deleted during fib_walk_sync(), make sure it can happen
only after clearing the SYNC_WALK_ACTIVE flag.

Type: fix

Change-Id: I68be00e9602e2783d9dced71c51547c38b7e8a00
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vnet/adj/adj_nbr.c

index 811d0b8..3344d6e 100644 (file)
@@ -750,12 +750,15 @@ adj_nbr_interface_state_change_one (adj_index_t ai,
     };
     ip_adjacency_t *adj;
 
+    adj_lock (ai);
+
     adj = adj_get(ai);
 
     adj->ia_flags |= ADJ_FLAG_SYNC_WALK_ACTIVE;
     fib_walk_sync(FIB_NODE_TYPE_ADJ, ai, &bw_ctx);
     adj->ia_flags &= ~ADJ_FLAG_SYNC_WALK_ACTIVE;
 
+    adj_unlock (ai);
     return (ADJ_WALK_RC_CONTINUE);
 }