From e645d898648ee4c6a9534e5d17da66c9dce3abe8 Mon Sep 17 00:00:00 2001 From: Alexis Christoforides Date: Thu, 26 Sep 2019 09:30:01 -0400 Subject: [PATCH] [merp] Output native library module name when 'whitelist all' mode is enabled (mono/mono#16899) Partially fixes https://github.com/mono/mono/issues/16689 Commit migrated from https://github.com/mono/mono/commit/4727b2475f89cf7343edbd095647635c0b26f67a --- src/mono/mono/metadata/threads-types.h | 2 +- src/mono/mono/mini/mini-exceptions.c | 29 +++++++++++++++++++++-------- src/mono/mono/utils/mono-state.c | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/mono/mono/metadata/threads-types.h b/src/mono/mono/metadata/threads-types.h index 64d9df4..762070b 100644 --- a/src/mono/mono/metadata/threads-types.h +++ b/src/mono/mono/metadata/threads-types.h @@ -496,7 +496,7 @@ typedef struct { struct { intptr_t ip; gint32 offset; - const char *module; + char module [MONO_MAX_SUMMARY_NAME_LEN]; gboolean is_trampoline; gboolean has_name; } unmanaged_data; diff --git a/src/mono/mono/mini/mini-exceptions.c b/src/mono/mono/mini/mini-exceptions.c index b2d74b1..10b85fd 100644 --- a/src/mono/mono/mini/mini-exceptions.c +++ b/src/mono/mono/mini/mini-exceptions.c @@ -1467,14 +1467,26 @@ check_whitelisted_module (const char *in_name, const char **out_module) #ifndef MONO_PRIVATE_CRASHES return TRUE; #else - if (allow_all_native_libraries) { + if (g_str_has_suffix (in_name, "mono-sgen")) { if (out_module) - *out_module = ""; + copy_summary_string_safe ((char *) *out_module, "mono"); return TRUE; } - if (g_str_has_suffix (in_name, "mono-sgen")) { - if (out_module) - *out_module = "mono"; + if (allow_all_native_libraries) { + if (out_module) { + /* for a module name, use the basename of the full path in in_name */ + char *basename = (char *) in_name, *p = (char *) in_name; + while (*p != '\0') { + if (*p == '/') + basename = p + 1; + p++; + } + if (*basename) + copy_summary_string_safe ((char *) *out_module, basename); + else + copy_summary_string_safe ((char *) *out_module, "unknown"); + + } return TRUE; } @@ -1483,7 +1495,7 @@ check_whitelisted_module (const char *in_name, const char **out_module) if (!g_str_has_suffix (in_name, iter->suffix)) continue; if (out_module) - *out_module = iter->exported_name; + copy_summary_string_safe ((char *) *out_module, iter->exported_name); return TRUE; } @@ -1577,6 +1589,7 @@ summarize_frame_internal (MonoMethod *method, gpointer ip, size_t native_offset, dest->unmanaged_data.ip = (intptr_t) ip; dest->is_managed = managed; + dest->unmanaged_data.module [0] = '\0'; if (!managed && method && method->wrapper_type != MONO_WRAPPER_NONE && method->wrapper_type < MONO_WRAPPER_NUM) { dest->is_managed = FALSE; @@ -1749,8 +1762,8 @@ mono_summarize_unmanaged_stack (MonoThreadSummary *out) for (int i =0; i < out->num_unmanaged_frames; ++i) { intptr_t ip = frame_ips [i]; MonoFrameSummary *frame = &out->unmanaged_frames [i]; - - int success = mono_get_portable_ip (ip, &frame->unmanaged_data.ip, &frame->unmanaged_data.offset, &frame->unmanaged_data.module, (char *) frame->str_descr); + const char* module_buf = frame->unmanaged_data.module; + int success = mono_get_portable_ip (ip, &frame->unmanaged_data.ip, &frame->unmanaged_data.offset, &module_buf, (char *) frame->str_descr); if (!success) continue; diff --git a/src/mono/mono/utils/mono-state.c b/src/mono/mono/utils/mono-state.c index 6f4bc2b..a8cc50e 100644 --- a/src/mono/mono/utils/mono-state.c +++ b/src/mono/mono/utils/mono-state.c @@ -531,7 +531,7 @@ mono_native_state_add_frame (MonoStateWriter *writer, MonoFrameSummary *frame) mono_state_writer_printf(writer, "\"0x%05x\"", frame->unmanaged_data.offset); } - if (frame->unmanaged_data.module) { + if (frame->unmanaged_data.module [0] != '\0') { mono_state_writer_printf(writer, ",\n"); assert_has_space (writer); -- 2.7.4