diff --git a/polkadot/node/network/statement-distribution/src/lib.rs b/polkadot/node/network/statement-distribution/src/lib.rs
index 54567f0d8afa51f8c8d6a868305609af340fbe90..7e91d2849120283c3fcefc4193a6e3d8bff809a1 100644
--- a/polkadot/node/network/statement-distribution/src/lib.rs
+++ b/polkadot/node/network/statement-distribution/src/lib.rs
@@ -319,10 +319,12 @@ impl<R: rand::Rng> StatementDistributionSubsystem<R> {
 				if let Some(ref activated) = activated {
 					let mode = prospective_parachains_mode(ctx.sender(), activated.hash).await?;
 					if let ProspectiveParachainsMode::Enabled { .. } = mode {
-						// Ensure we deactivate first, before we activate the new block.
-						// Activation can fail and then we would skip the deactivation.
+						let res =
+							v2::handle_active_leaves_update(ctx, state, activated, mode).await;
+						// Regardless of the result of leaf activation, we always prune before
+						// handling it to avoid leaks.
 						v2::handle_deactivate_leaves(state, &deactivated);
-						v2::handle_active_leaves_update(ctx, state, activated, mode).await?;
+						res?;
 					} else if let ProspectiveParachainsMode::Disabled = mode {
 						for deactivated in &deactivated {
 							crate::legacy_v1::handle_deactivate_leaf(legacy_v1_state, *deactivated);