summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2014-08-02 00:54:15 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2014-08-02 00:54:15 +0000
commitea2b9a4f6f451ec1e80533a7f12b50ac5b56a7a4 (patch)
treed37998f4cbceacc74d2de058a6ad5c59557e4f02 /libgo
parent79f1f232fbc86a1e261168d5b83ae2abedd9d27d (diff)
downloadgcc-ea2b9a4f6f451ec1e80533a7f12b50ac5b56a7a4.tar.gz
PR other/61895
runtime: Ignore small argv[0] file for backtrace. Reportedly in some cases Docker starts processes with argv[0] pointing to an empty file. That would cause libgo to pass that empty file to libbacktrace, which would then fail to do any backtraces. Everything should work fine if libbacktrace falls back to /proc/self/exe. This patch to libgo works around the problem by ignoring argv[0] if it is a small file, or if stat fails. This is not a perfect fix but it's an unusual problem. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213513 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo')
-rw-r--r--libgo/runtime/go-caller.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libgo/runtime/go-caller.c b/libgo/runtime/go-caller.c
index a5c687d00f4..7fcdf2021d3 100644
--- a/libgo/runtime/go-caller.c
+++ b/libgo/runtime/go-caller.c
@@ -7,6 +7,9 @@
/* Implement runtime.Caller. */
#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
#include "backtrace.h"
@@ -99,6 +102,7 @@ __go_get_backtrace_state ()
if (back_state == NULL)
{
const char *filename;
+ struct stat s;
filename = (const char *) runtime_progname ();
@@ -108,6 +112,14 @@ __go_get_backtrace_state ()
if (__builtin_strchr (filename, '/') == NULL)
filename = NULL;
+ /* If the file is small, then it's not the real executable.
+ This is specifically to deal with Docker, which uses a bogus
+ argv[0] (http://gcc.gnu.org/PR61895). It would be nice to
+ have a better check for whether this file is the real
+ executable. */
+ if (stat (filename, &s) < 0 || s.st_size < 1024)
+ filename = NULL;
+
back_state = backtrace_create_state (filename, 1, error_callback, NULL);
}
runtime_unlock (&back_state_lock);