Blob Blame History Raw
From a94b495c5b48324cecff42afce15a4d843577741 Mon Sep 17 00:00:00 2001
From: Jonathan Lebon <jlebon@redhat.com>
Date: Wed, 13 Nov 2013 12:29:49 -0500
Subject: BZ1054962

BZ1054962: PR16166: assign token to new block

BZ1054962: stap translator: tolerate NULLs coming from some elfutils string lookups

It was reported on the mailing list, and privately experienced, that
stap pass-2 crashes could occur due to NULL dwarf_diename or
dwarf_decl_file's being propagated rather far within stap.  This
commit adds protections (of the form ?: "foo") to eliminate the
problem in a few spots.  There may be others; we should not store
so many raw char*'s.
---
 dwflpp.cxx  |  4 ++--
 tapsets.cxx | 16 +++++++++++-----
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/dwflpp.cxx b/dwflpp.cxx
index f8b1517..93713d0 100644
--- a/dwflpp.cxx
+++ b/dwflpp.cxx
@@ -1742,7 +1742,7 @@ dwflpp::iterate_over_labels (Dwarf_Die *begin_die,
                 {
                   // Get the file/line number for this label
                   int dline;
-                  const char *file = dwarf_decl_file (&die);
+                  const char *file = dwarf_decl_file (&die) ?: "<unknown source>";
                   dwarf_decl_line (&die, &dline);
 
                   vector<Dwarf_Die> scopes = getscopes_die(&die);
@@ -2045,7 +2045,7 @@ dwflpp::function_file (char const ** c)
 {
   assert (function);
   assert (c);
-  *c = dwarf_decl_file (function);
+  *c = dwarf_decl_file (function) ?: "<unknown source>";
 }
 
 
diff --git a/tapsets.cxx b/tapsets.cxx
index 6dea4d2..205de34 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -1683,8 +1683,14 @@ inline_instance_info::operator<(const inline_instance_info& other) const
     return decl_line < other.decl_line;
 
   int cmp = name.compare(other.name);
-  if (!cmp)
-    cmp = strcmp(decl_file, other.decl_file);
+
+  if (!cmp) 
+    {
+      assert (decl_file);
+      assert (other.decl_file);
+      cmp = strcmp(decl_file, other.decl_file);
+    }
+
   return cmp < 0;
 }
 
@@ -3874,6 +3880,7 @@ dwarf_var_expanding_visitor::visit_perf_op (perf_op *e)
   t->content = e_lit_val;
 
   add_block = new block;
+  add_block->tok = e->tok;
 
   systemtap_session &s = this->q.sess;
   map<string, pair<string,derived_probe*> >::iterator it;
@@ -4187,8 +4194,7 @@ dwarf_atvar_query::atvar_query_cu (Dwarf_Die * cudie, void * data)
 
   if (! q->e.cu_name.empty())
     {
-      const char *die_name = dwarf_diename(cudie);
-
+      const char *die_name = dwarf_diename(cudie) ?: "";
       if (strcmp(die_name, q->e.cu_name.c_str()) != 0 // Perfect match
           && fnmatch(q->cu_name_pattern.c_str(), die_name, 0) != 0)
         {
@@ -9714,7 +9720,7 @@ tracepoint_derived_probe::build_args(dwflpp&, Dwarf_Die& func_die)
         {
           // build a tracepoint_arg for this parameter
           tracepoint_arg tparg;
-          tparg.name = dwarf_diename(&arg);
+          tparg.name = dwarf_diename(&arg) ?: "";
 
           // read the type of this parameter
           if (!dwarf_attr_die (&arg, DW_AT_type, &tparg.type_die)
-- 
1.8.3.1