diff options
author | Matthew Smith <mgsmith@netgate.com> | 2022-02-08 21:34:05 +0000 |
---|---|---|
committer | Matthew Smith <mgsmith@netgate.com> | 2022-02-22 13:28:53 -0600 |
commit | a7d7383a44335358a40d7c2b322999958a717a60 (patch) | |
tree | dba3014e24974a2b75862326980b37fe6bd440b2 /src/plugins/vrrp/vrrp.c | |
parent | d9d77076b01347dfc1dd98cee80a298729ce9b85 (diff) |
vrrp: fix thread synchronization issue
Type: fix
Fixes: 39e9428b90bc
When a VRRP advertisement is received by a worker thread, the worker
calls vl_api_rpc_call_main_thread() so the main thread will process the
packet and make adjustments to VR state if necessary.
The data being passed to the main thread included a pointer to the VRRP
header in the received packet buffer. Since the main thread processes
the RPC request asynchronously from the worker thread, it's possible for
the worker to drop the packet and for the buffer to be overwritten before
the main thread can process it.
Copy the fields which may be needed by the main thread into a struct
instead of passing a pointer to a packet buffer.
Change-Id: I4e899e967df5a54776b521825a80e9cce1a94f5f
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Diffstat (limited to 'src/plugins/vrrp/vrrp.c')
-rw-r--r-- | src/plugins/vrrp/vrrp.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/plugins/vrrp/vrrp.c b/src/plugins/vrrp/vrrp.c index 8461798e02a..99533edaca0 100644 --- a/src/plugins/vrrp/vrrp.c +++ b/src/plugins/vrrp/vrrp.c @@ -310,9 +310,10 @@ vrrp_vr_transition (vrrp_vr_t * vr, vrrp_vr_state_t new_state, void *data) if (vr->runtime.state == VRRP_VR_STATE_MASTER) { - vrrp_header_t *pkt = data; - vr->runtime.master_adv_int = vrrp_adv_int_from_packet (pkt); + vrrp_input_process_args_t *args = data; + if (args) + vr->runtime.master_adv_int = args->max_adv_int; } else /* INIT, INTF_DOWN */ vr->runtime.master_adv_int = vr->config.adv_interval; |