summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorVicențiu Ciorbaru <vicentiu@mariadb.org>2016-05-30 22:33:34 +0300
committerVicențiu Ciorbaru <vicentiu@mariadb.org>2016-07-12 11:58:20 +0300
commit7d4a7d8c5861e6587176052ea71c30ab12a49084 (patch)
tree80e3c545b5067c01215bbee589404af99961069e /mysys
parent406fe77763c43dd7e151d92364e0296539077d4a (diff)
downloadmariadb-git-7d4a7d8c5861e6587176052ea71c30ab12a49084.tar.gz
[MDEV-9127] Crash reporter often fails to show the query that crashed
Addreses are not necessarily between heap_start && heap_end. Malloc calls using mmap can place pointers outside these bounds. In this case, we'll warn the user that the query pointer is potentially invalid. However, we'll attempt to print the data anyway after we're done printing everything else.
Diffstat (limited to 'mysys')
-rw-r--r--mysys/stacktrace.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/mysys/stacktrace.c b/mysys/stacktrace.c
index 613911e4495..746b99d6112 100644
--- a/mysys/stacktrace.c
+++ b/mysys/stacktrace.c
@@ -129,13 +129,32 @@ static int safe_print_str(const char *addr, int max_len)
#endif
-void my_safe_print_str(const char* val, int max_len)
+/*
+ Attempt to print a char * pointer as a string.
+
+ SYNOPSIS
+ Prints either until the end of string ('\0'), or max_len characters have
+ been printed.
+
+ RETURN VALUE
+ 0 Pointer was within the heap address space.
+ The string was printed fully, or until the end of the heap address space.
+ 1 Pointer is outside the heap address space. Printed as invalid.
+
+ NOTE
+ On some systems, we can have valid pointers outside the heap address space.
+ This is through the use of mmap inside malloc calls. When this function
+ returns 1, it does not mean 100% that the pointer is corrupted.
+*/
+
+int my_safe_print_str(const char* val, int max_len)
{
char *heap_end;
#ifdef __linux__
+ // Try and make use of /proc filesystem to safely print memory contents.
if (!safe_print_str(val, max_len))
- return;
+ return 0;
#endif
heap_end= (char*) sbrk(0);
@@ -143,12 +162,14 @@ void my_safe_print_str(const char* val, int max_len)
if (!PTR_SANE(val))
{
my_safe_printf_stderr("%s", "is an invalid pointer");
- return;
+ return 1;
}
for (; max_len && PTR_SANE(val) && *val; --max_len)
my_write_stderr((val++), 1);
my_safe_printf_stderr("%s", "\n");
+
+ return 0;
}
#if defined(HAVE_PRINTSTACK)
@@ -728,7 +749,7 @@ void my_write_core(int unused)
}
-void my_safe_print_str(const char *val, int len)
+int my_safe_print_str(const char *val, int len)
{
__try
{
@@ -738,6 +759,7 @@ void my_safe_print_str(const char *val, int len)
{
my_safe_printf_stderr("%s", "is an invalid string pointer");
}
+ return 0;
}
#endif /*__WIN__*/