This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Avoid backtrace tests matching filenames when searching for functionnames


An issue pointed out with the new backtrace tests was that the test
for substrings of the decoded symbols could spuriously match a
filename instead.  This patch restricts the matching to text after the
first '(' in the name (the filename is before the '('; inside the '()'
are the function name and hex offset).

Tested x86_64.

2013-01-22  Joseph Myers  <joseph@codesourcery.com>

	* debug/tst-backtrace.h: New file.
	* debug/tst-backtrace2.c: Include tst-backtrace.h.
	(fn1): Use match function instead of strstr.
	* debug/tst-backtrace3.c: Include tst-backtrace.h.
	(fn): Use match function instead of strstr.
	* debug/tst-backtrace4.c: Include tst-backtrace.h.
	(handle_signal): Use match function instead of strstr.
	* debug/tst-backtrace5.c: Include tst-backtrace.h.
	(handle_signal): Use match function instead of strstr.

diff --git a/debug/tst-backtrace.h b/debug/tst-backtrace.h
new file mode 100644
index 0000000..3a77449
--- /dev/null
+++ b/debug/tst-backtrace.h
@@ -0,0 +1,31 @@
+/* Test backtrace and backtrace_symbols: common code for examining
+   backtraces.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Look for a match in SYM from backtrace_symbols to NAME, a fragment
+   of a function name.  */
+
+static inline const char *
+match (const char *sym, const char *name)
+{
+  char *p = strchr (sym, '(');
+  if (p)
+    return strstr (p, name);
+  else
+    return NULL;
+}
diff --git a/debug/tst-backtrace2.c b/debug/tst-backtrace2.c
index e1d4572..0b8ee98 100644
--- a/debug/tst-backtrace2.c
+++ b/debug/tst-backtrace2.c
@@ -22,6 +22,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "tst-backtrace.h"
+
 static int do_test (void);
 #define TEST_FUNCTION do_test ()
 #include "../test-skeleton.c"
@@ -71,14 +73,14 @@ fn1 (void)
   for (i = 0; i < n; ++i)
     printf ("Function %d: %s\n", i, symbols[i]);
   /* Check that the function names obtained are accurate.  */
-  if (strstr (symbols[0], "fn1") == NULL)
+  if (match (symbols[0], "fn1") == NULL)
     {
       FAIL ();
       return;
     }
   /* Symbol names are not available for static functions, so we do not
      check f2.  */
-  if (strstr (symbols[2], "fn3") == NULL)
+  if (match (symbols[2], "fn3") == NULL)
     {
       FAIL ();
       return;
diff --git a/debug/tst-backtrace3.c b/debug/tst-backtrace3.c
index 4d3309b..52f98de 100644
--- a/debug/tst-backtrace3.c
+++ b/debug/tst-backtrace3.c
@@ -22,6 +22,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "tst-backtrace.h"
+
 static int do_test (void);
 #define TEST_FUNCTION do_test ()
 #include "../test-skeleton.c"
@@ -77,7 +79,7 @@ fn (int c)
     printf ("Function %d: %s\n", i, symbols[i]);
   /* Check that the function names obtained are accurate.  */
   for (i = 0; i < n - 1; ++i)
-    if (strstr (symbols[i], "fn") == NULL)
+    if (match (symbols[i], "fn") == NULL)
       {
 	FAIL ();
 	return 1;
diff --git a/debug/tst-backtrace4.c b/debug/tst-backtrace4.c
index 41a3f51..c619a96 100644
--- a/debug/tst-backtrace4.c
+++ b/debug/tst-backtrace4.c
@@ -25,6 +25,8 @@
 #include <signal.h>
 #include <unistd.h>
 
+#include "tst-backtrace.h"
+
 static int do_test (void);
 #define TEST_FUNCTION do_test ()
 #include "../test-skeleton.c"
@@ -79,14 +81,14 @@ handle_signal (int signum)
   for (i = 0; i < n; ++i)
     printf ("Function %d: %s\n", i, symbols[i]);
   /* Check that the function names obtained are accurate.  */
-  if (strstr (symbols[0], "handle_signal") == NULL)
+  if (match (symbols[0], "handle_signal") == NULL)
     {
       FAIL ();
       return;
     }
   /* Do not check name for signal trampoline.  */
   for (i = 2; i < n - 1; i++)
-    if (strstr (symbols[i], "fn") == NULL)
+    if (match (symbols[i], "fn") == NULL)
       {
 	FAIL ();
 	return;
diff --git a/debug/tst-backtrace5.c b/debug/tst-backtrace5.c
index eb16c23..f825931 100644
--- a/debug/tst-backtrace5.c
+++ b/debug/tst-backtrace5.c
@@ -26,6 +26,8 @@
 #include <signal.h>
 #include <unistd.h>
 
+#include "tst-backtrace.h"
+
 static int do_test (void);
 #define TEST_FUNCTION do_test ()
 #include "../test-skeleton.c"
@@ -76,24 +78,24 @@ handle_signal (int signum)
   for (i = 0; i < n; ++i)
     printf ("Function %d: %s\n", i, symbols[i]);
   /* Check that the function names obtained are accurate.  */
-  if (strstr (symbols[0], "handle_signal") == NULL)
+  if (match (symbols[0], "handle_signal") == NULL)
     {
       FAIL ();
       return;
     }
   /* Do not check name for signal trampoline.  */
   i = 2;
-  if (strstr (symbols[i++], "read") == NULL)
+  if (match (symbols[i++], "read") == NULL)
     {
       /* Perhaps symbols[2] is __kernel_vsyscall?  */
-      if (strstr (symbols[i++], "read") == NULL)
+      if (match (symbols[i++], "read") == NULL)
 	{
 	  FAIL ();
 	  return;
 	}
     }
   for (; i < n - 1; i++)
-    if (strstr (symbols[i], "fn") == NULL)
+    if (match (symbols[i], "fn") == NULL)
       {
 	FAIL ();
 	return;

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]