Prevent Segfault in EventPipe on disable (#56104)
authorJohn Salem <josalem@microsoft.com>
Tue, 27 Jul 2021 22:55:00 +0000 (15:55 -0700)
committerGitHub <noreply@github.com>
Tue, 27 Jul 2021 22:55:00 +0000 (15:55 -0700)
src/native/eventpipe/ep-types.h
src/native/eventpipe/ep.c

index 63e36c6..8bec5f1 100644 (file)
@@ -63,7 +63,7 @@ struct _EventPipeProviderCallbackData {
 #else
 struct _EventPipeProviderCallbackData_Internal {
 #endif
-       const ep_char8_t *filter_data;
+       ep_char8_t *filter_data;
        EventPipeCallback callback_function;
        void *callback_data;
        int64_t keywords;
index 38c1e1a..eb401dc 100644 (file)
@@ -246,8 +246,10 @@ ep_provider_callback_data_alloc_copy (EventPipeProviderCallbackData *provider_ca
        EventPipeProviderCallbackData *instance = ep_rt_object_alloc (EventPipeProviderCallbackData);
        ep_raise_error_if_nok (instance != NULL);
 
-       if (provider_callback_data_src)
+       if (provider_callback_data_src) {
                *instance = *provider_callback_data_src;
+               instance->filter_data = ep_rt_utf8_string_dup (provider_callback_data_src->filter_data);
+       }
 
 ep_on_exit:
        return instance;
@@ -270,7 +272,7 @@ ep_provider_callback_data_init (
 {
        EP_ASSERT (provider_callback_data != NULL);
 
-       provider_callback_data->filter_data = filter_data;
+       provider_callback_data->filter_data = ep_rt_utf8_string_dup (filter_data);
        provider_callback_data->callback_function = callback_function;
        provider_callback_data->callback_data = callback_data;
        provider_callback_data->keywords = keywords;
@@ -289,19 +291,22 @@ ep_provider_callback_data_init_copy (
        EP_ASSERT (provider_callback_data_src != NULL);
 
        *provider_callback_data_dst = *provider_callback_data_src;
+       provider_callback_data_dst->filter_data = ep_rt_utf8_string_dup (provider_callback_data_src->filter_data);
        return provider_callback_data_dst;
 }
 
 void
 ep_provider_callback_data_fini (EventPipeProviderCallbackData *provider_callback_data)
 {
-       ;
+       ep_return_void_if_nok (provider_callback_data != NULL);
+       ep_rt_utf8_string_free (provider_callback_data->filter_data);
 }
 
 void
 ep_provider_callback_data_free (EventPipeProviderCallbackData *provider_callback_data)
 {
        ep_return_void_if_nok (provider_callback_data != NULL);
+       ep_provider_callback_data_fini (provider_callback_data);
        ep_rt_object_free (provider_callback_data);
 }