From def474d3acceecec4bd536adc9579c9f50569c77 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 1 Aug 2018 15:06:55 +0200 Subject: [PATCH] Don't leak blocks if GetCheckedHandle throws. --- src/Network/NWConnection.cs | 63 +++++++++++++++++++++++---------- src/Network/NWContentContext.cs | 7 ++-- src/Network/NWListener.cs | 21 +++++++---- src/Network/NWParameters.cs | 14 +++++--- src/Network/NWPath.cs | 7 ++-- src/Network/NWProtocolStack.cs | 7 ++-- 6 files changed, 85 insertions(+), 34 deletions(-) diff --git a/src/Network/NWConnection.cs b/src/Network/NWConnection.cs index f4f089978d..e8e3192c2f 100644 --- a/src/Network/NWConnection.cs +++ b/src/Network/NWConnection.cs @@ -109,8 +109,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_stateChangeHandler, stateHandler); - nw_connection_set_state_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_set_state_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -141,8 +144,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_BooleanChangeHandler, callback); - nw_connection_set_viability_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_set_viability_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -162,8 +168,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_BooleanChangeHandler, callback); - nw_connection_set_better_path_available_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_set_better_path_available_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -191,8 +200,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_PathChanged, callback); - nw_connection_set_path_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_set_path_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -302,8 +314,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_ReceiveCompletion, callback); - nw_connection_receive (GetCheckedHandle (), minimumIncompleteLength, maximumLength, (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_receive (GetCheckedHandle (), minimumIncompleteLength, maximumLength, (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -318,8 +333,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_ReceiveCompletionDispatchData, callback); - nw_connection_receive (GetCheckedHandle (), minimumIncompleteLength, maximumLength, (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_receive (GetCheckedHandle (), minimumIncompleteLength, maximumLength, (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -337,8 +355,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_ReceiveCompletion, callback); - nw_connection_receive_message (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_receive_message (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -353,8 +374,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_ReceiveCompletionDispatchData, callback); - nw_connection_receive_message (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_connection_receive_message (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -424,8 +448,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_SendCompletion, callback); - LowLevelSend (GetCheckedHandle (), buffer, context.Handle, isComplete, block_ptr_handler); - block_handler.CleanupBlock (); + try { + LowLevelSend (GetCheckedHandle (), buffer, context.Handle, isComplete, block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } diff --git a/src/Network/NWContentContext.cs b/src/Network/NWContentContext.cs index 299a163f55..2d07313434 100644 --- a/src/Network/NWContentContext.cs +++ b/src/Network/NWContentContext.cs @@ -182,8 +182,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_ProtocolIterator, callback); - nw_content_context_foreach_protocol_metadata (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_content_context_foreach_protocol_metadata (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } diff --git a/src/Network/NWListener.cs b/src/Network/NWListener.cs index ddd7796a3a..0a64e9c2bc 100644 --- a/src/Network/NWListener.cs +++ b/src/Network/NWListener.cs @@ -133,8 +133,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_ListenerStateChanged, callback); - nw_listener_set_state_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_listener_set_state_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -167,8 +170,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_NewConnection, callback); - nw_listener_set_new_connection_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_listener_set_new_connection_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -204,8 +210,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_AdvertisedEndpointChangedHandler, callback); - nw_listener_set_advertised_endpoint_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_listener_set_advertised_endpoint_changed_handler (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } diff --git a/src/Network/NWParameters.cs b/src/Network/NWParameters.cs index be3d68d191..53919b4488 100644 --- a/src/Network/NWParameters.cs +++ b/src/Network/NWParameters.cs @@ -377,8 +377,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_iterateProhibitedHandler, iterationCallback); - nw_parameters_iterate_prohibited_interfaces (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_parameters_iterate_prohibited_interfaces (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } @@ -408,8 +411,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_IterateProhibitedTypeHandler, callback); - nw_parameters_iterate_prohibited_interface_types (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_parameters_iterate_prohibited_interface_types (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } diff --git a/src/Network/NWPath.cs b/src/Network/NWPath.cs index f4fcb8cb1a..b5644db62c 100644 --- a/src/Network/NWPath.cs +++ b/src/Network/NWPath.cs @@ -121,8 +121,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_Enumerator, callback); - nw_path_enumerate_interfaces (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_path_enumerate_interfaces (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } } } diff --git a/src/Network/NWProtocolStack.cs b/src/Network/NWProtocolStack.cs index e45af332c0..606d15234e 100644 --- a/src/Network/NWProtocolStack.cs +++ b/src/Network/NWProtocolStack.cs @@ -71,8 +71,11 @@ namespace Network { BlockLiteral *block_ptr_handler = &block_handler; block_handler.SetupBlockUnsafe (static_iterateHandler, callback); - nw_protocol_stack_iterate_application_protocols (GetCheckedHandle (), (void*) block_ptr_handler); - block_handler.CleanupBlock (); + try { + nw_protocol_stack_iterate_application_protocols (GetCheckedHandle (), (void*) block_ptr_handler); + } finally { + block_handler.CleanupBlock (); + } } }