]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR other/61895 (libbacktrace crashes with bus error with empty file argv[0])
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 2 Aug 2014 00:54:15 +0000 (00:54 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 2 Aug 2014 00:54:15 +0000 (00:54 +0000)
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.

From-SVN: r213513

libgo/runtime/go-caller.c

index a5c687d00f49f816f7e37a0edefb68b87eeb06ec..7fcdf2021d399f7c4abeaa1d2bd43b906ed32ac3 100644 (file)
@@ -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);