mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
MDEV-30613 output_core_info crashes in my_read()
and my_getwd(). The cause is my_errno define which depends on my_thread_var being a not null pointer otherwise it will be de-referenced and cause a SEGV already in the signal handler. Replace uses of these functions in the output_core_info using posix read/getcwd functions instead. The getwd fallback in my_getcwd isn't needed as its been obsolute for a very long time. Thanks Vladislav Vaintroub for diagnosis and posix recommendation.
This commit is contained in:
parent
2f6bb9cda5
commit
94ed30e505
1 changed files with 17 additions and 13 deletions
|
@ -27,6 +27,7 @@
|
|||
|
||||
#ifdef __WIN__
|
||||
#include <crtdbg.h>
|
||||
#include <direct.h>
|
||||
#define SIGNAL_FMT "exception 0x%x"
|
||||
#else
|
||||
#define SIGNAL_FMT "signal %d"
|
||||
|
@ -67,27 +68,27 @@ static inline void output_core_info()
|
|||
my_safe_printf_stderr("Writing a core file...\nWorking directory at %.*s\n",
|
||||
(int) len, buff);
|
||||
}
|
||||
if ((fd= my_open("/proc/self/limits", O_RDONLY, MYF(0))) >= 0)
|
||||
if ((fd= open("/proc/self/limits", O_RDONLY, MYF(0))) >= 0)
|
||||
{
|
||||
my_safe_printf_stderr("Resource Limits:\n");
|
||||
while ((len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0))) > 0)
|
||||
while ((len= read(fd, (uchar*)buff, sizeof(buff))) > 0)
|
||||
{
|
||||
my_write_stderr(buff, len);
|
||||
}
|
||||
my_close(fd, MYF(0));
|
||||
close(fd);
|
||||
}
|
||||
#ifdef __linux__
|
||||
if ((fd= my_open("/proc/sys/kernel/core_pattern", O_RDONLY, MYF(0))) >= 0)
|
||||
if ((fd= open("/proc/sys/kernel/core_pattern", O_RDONLY, MYF(0))) >= 0)
|
||||
{
|
||||
len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0));
|
||||
len= read(fd, (uchar*)buff, sizeof(buff));
|
||||
my_safe_printf_stderr("Core pattern: %.*s\n", (int) len, buff);
|
||||
my_close(fd, MYF(0));
|
||||
close(fd);
|
||||
}
|
||||
if ((fd= my_open("/proc/version", O_RDONLY, MYF(0))) >= 0)
|
||||
if ((fd= open("/proc/version", O_RDONLY)) >= 0)
|
||||
{
|
||||
len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0));
|
||||
len= read(fd, (uchar*)buff, sizeof(buff));
|
||||
my_safe_printf_stderr("Kernel version: %.*s\n", (int) len, buff);
|
||||
my_close(fd, MYF(0));
|
||||
close(fd);
|
||||
}
|
||||
#endif
|
||||
#elif defined(__APPLE__) || defined(__FreeBSD__)
|
||||
|
@ -101,11 +102,14 @@ static inline void output_core_info()
|
|||
{
|
||||
my_safe_printf_stderr("Kernel version: %.*s\n", (int) len, buff);
|
||||
}
|
||||
#else
|
||||
#elif defined(HAVE_GETCWD)
|
||||
char buff[80];
|
||||
my_getwd(buff, sizeof(buff), 0);
|
||||
my_safe_printf_stderr("Writing a core file at %s\n", buff);
|
||||
fflush(stderr);
|
||||
|
||||
if (getcwd(buff, sizeof(buff)))
|
||||
{
|
||||
my_safe_printf_stderr("Writing a core file at %.*s\n", (int) sizeof(buff), buff);
|
||||
fflush(stderr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue