From: Pedro Alves Date: Tue, 12 Feb 2013 15:03:12 +0000 (+0000) Subject: From: Sanimir Agovic X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8a4ac37ef487aa7923a44e1ca4afef8fff828fb7;p=binutils-gdb.git From: Sanimir Agovic null ptr check to prevent gdbserver from crashing Evaluating a thread local storage variable in a remote scenario crashes gdbserver if libthread-db could not be loaded. 2013-02-12 Sanimir Agovic gdbserver/ * thread-db.c (thread_db_get_tls_address): NULL pointer check thread_db. testsuite/ * gdb.server/no-thread-db.exp: New file. * gdb.server/no-thread-db.c: New file. * gdb.server/Makefile.in (EXECUTABLES): Add no-thread-db. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index f2d41d821f1..371c02beb3c 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2013-02-12 Sanimir Agovic + + * thread-db.c (thread_db_get_tls_address): NULL pointer check + thread_db. + 2013-02-07 Marcus Shawcroft * linux-aarch64-low.c (aarch64_arch_setup): Clamp diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c index f4afde31209..e8d3481738f 100644 --- a/gdb/gdbserver/thread-db.c +++ b/gdb/gdbserver/thread-db.c @@ -494,7 +494,7 @@ thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset, thread_db = proc->private->thread_db; /* If the thread layer is not (yet) initialized, fail. */ - if (!thread_db->all_symbols_looked_up) + if (thread_db == NULL || !thread_db->all_symbols_looked_up) return TD_ERR; if (thread_db->td_thr_tls_get_addr_p == NULL) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bdbc59a0fc9..a0cd80fe86e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-02-12 Sanimir Agovic + + * gdb.server/no-thread-db.exp: New file. + * gdb.server/no-thread-db.c: New file. + * gdb.server/Makefile.in (EXECUTABLES): Add no-thread-db. + 2013-02-11 Doug Evans * gdb.base/printcmds.exp (test_printf_with_dfp): Add test for printing diff --git a/gdb/testsuite/gdb.server/Makefile.in b/gdb/testsuite/gdb.server/Makefile.in index 8d9a8675291..509fbd8b08a 100644 --- a/gdb/testsuite/gdb.server/Makefile.in +++ b/gdb/testsuite/gdb.server/Makefile.in @@ -1,7 +1,8 @@ VPATH = @srcdir@ srcdir = @srcdir@ -EXECUTABLES = ext-attach ext-run file-transfer server-mon server-run +EXECUTABLES = ext-attach ext-run file-transfer server-mon server-run \ + no-thread-db MISCELLANEOUS = diff --git a/gdb/testsuite/gdb.server/no-thread-db.c b/gdb/testsuite/gdb.server/no-thread-db.c new file mode 100644 index 00000000000..4974da7b5d3 --- /dev/null +++ b/gdb/testsuite/gdb.server/no-thread-db.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2012-2013 Free Software Foundation, Inc. + + Contributed by Intel Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +__thread int foo; + +int +main () +{ + foo = 1; + /* after tls assignment */ + return foo; +} diff --git a/gdb/testsuite/gdb.server/no-thread-db.exp b/gdb/testsuite/gdb.server/no-thread-db.exp new file mode 100644 index 00000000000..6f2cb9dd07b --- /dev/null +++ b/gdb/testsuite/gdb.server/no-thread-db.exp @@ -0,0 +1,56 @@ +# This testcase is part of GDB, the GNU debugger. +# +# Copyright 2012-2013 Free Software Foundation, Inc. +# +# Contributed by Intel Corporation. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test gdbserver to handle qGetTLSAddr requests gracefully in case +# libthread_db could not be loaded. + +load_lib gdbserver-support.exp + +standard_testfile +set unresolvable_thread_db_path "/foo/bar" + +if {[skip_gdbserver_tests]} { + return 0 +} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +clean_restart ${testfile} + +# Make sure we're disconnected, in case we're testing with an +# extended-remote board, therefore already connected. +gdb_test "disconnect" ".*" + +gdbserver_run "" + +# Force gdbserver to fail to load libthread_db. +gdb_test "monitor set libthread-db-search-path ${unresolvable_thread_db_path}" \ + "libthread-db-search-path set to `${unresolvable_thread_db_path}'" \ + "libthread-db is now unresolvable" + +# Continue past tls assignment to make sure tls storage is allocated. +gdb_breakpoint [gdb_get_line_number "after tls assignment"] +gdb_continue_to_breakpoint "after tls assignment" + +# Printing a tls variable should fail gracefully without a libthread_db. +gdb_test "print foo" \ + "Cannot find thread-local storage for Thread \[^,\]+, executable file ${binfile}:\[\r\n\]+Remote target failed to process qGetTLSAddr request" \ + "print foo"