From 4cb39a49cd6928f6f2c496779c7d0b092be1ef33 Mon Sep 17 00:00:00 2001 From: Greg Mitchell Date: Tue, 3 Feb 2026 17:30:27 +0000 Subject: [PATCH] fix: enforce multicastgroup ip allocate can't be called twice Related to #2798 --- .../src/processors/multicastgroup/activate.rs | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/smartcontract/programs/doublezero-serviceability/src/processors/multicastgroup/activate.rs b/smartcontract/programs/doublezero-serviceability/src/processors/multicastgroup/activate.rs index d9b2ec565..466fad989 100644 --- a/smartcontract/programs/doublezero-serviceability/src/processors/multicastgroup/activate.rs +++ b/smartcontract/programs/doublezero-serviceability/src/processors/multicastgroup/activate.rs @@ -107,18 +107,21 @@ pub fn process_activate_multicastgroup( "Invalid ResourceExtension PDA for MulticastGroupBlock" ); - // Allocate from ResourceExtension bitmap - let mut buffer = resource_ext.data.borrow_mut(); - let mut resource = ResourceExtensionBorrowed::inplace_from(&mut buffer[..])?; - - let allocated = resource.allocate(1)?; - - match allocated { - IdOrIp::Ip(network) => { - multicastgroup.multicast_ip = network.ip(); - } - IdOrIp::Id(_) => { - return Err(DoubleZeroError::InvalidArgument.into()); + // Allocate from ResourceExtension bitmap (only if not already allocated) + // This check handles potential re-activation scenarios where resources may already be assigned + if multicastgroup.multicast_ip == std::net::Ipv4Addr::UNSPECIFIED { + let mut buffer = resource_ext.data.borrow_mut(); + let mut resource = ResourceExtensionBorrowed::inplace_from(&mut buffer[..])?; + + let allocated = resource.allocate(1)?; + + match allocated { + IdOrIp::Ip(network) => { + multicastgroup.multicast_ip = network.ip(); + } + IdOrIp::Id(_) => { + return Err(DoubleZeroError::InvalidArgument.into()); + } } } } else {