gdbserver: Fix crash when QTinit is handled with no inferior process attached

Message ID 1422387337-32334-1-git-send-email-antoine.tremblay@ericsson.com
State New, archived
Headers

Commit Message

Antoine Tremblay Jan. 27, 2015, 7:35 p.m. UTC
  When gdbserver is called with --multi and attach has not been called yet
and tstart is called on the gdb client, gdbserver would crash.
This patch fixes gdbserver so that it returns E01 to the gdb client.

Also this patch adds a testcase to verify this bug named no-attach-trace.exp

gdb/ChangeLog:
	PR gdb/15956
	* gdb/gdbserver/tracepoint.c (cmd_qtinit): Added check for
	current_thread.

gdb/testsuite/ChangeLog:
	* gdb.server/no-attach-trace.c: New file.
	* gdb.server/no-attach-trace.exp: New file.
---
 gdb/gdbserver/tracepoint.c                   |    7 +++++
 gdb/testsuite/gdb.server/Makefile.in         |    2 +-
 gdb/testsuite/gdb.server/no-attach-trace.c   |   25 ++++++++++++++++
 gdb/testsuite/gdb.server/no-attach-trace.exp |   40 ++++++++++++++++++++++++++
 4 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 gdb/testsuite/gdb.server/no-attach-trace.c
 create mode 100644 gdb/testsuite/gdb.server/no-attach-trace.exp
  

Comments

Antoine Tremblay Feb. 5, 2015, 1:30 p.m. UTC | #1
ping

On 01/27/2015 02:35 PM, Antoine Tremblay wrote:
> When gdbserver is called with --multi and attach has not been called yet
> and tstart is called on the gdb client, gdbserver would crash.
> This patch fixes gdbserver so that it returns E01 to the gdb client.
>
> Also this patch adds a testcase to verify this bug named no-attach-trace.exp
>
> gdb/ChangeLog:
> 	PR gdb/15956
> 	* gdb/gdbserver/tracepoint.c (cmd_qtinit): Added check for
> 	current_thread.
>
> gdb/testsuite/ChangeLog:
> 	* gdb.server/no-attach-trace.c: New file.
> 	* gdb.server/no-attach-trace.exp: New file.
> ---
>   gdb/gdbserver/tracepoint.c                   |    7 +++++
>   gdb/testsuite/gdb.server/Makefile.in         |    2 +-
>   gdb/testsuite/gdb.server/no-attach-trace.c   |   25 ++++++++++++++++
>   gdb/testsuite/gdb.server/no-attach-trace.exp |   40 ++++++++++++++++++++++++++
>   4 files changed, 73 insertions(+), 1 deletion(-)
>   create mode 100644 gdb/testsuite/gdb.server/no-attach-trace.c
>   create mode 100644 gdb/testsuite/gdb.server/no-attach-trace.exp
>
> diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
> index 82d6ce5..0518530 100644
> --- a/gdb/gdbserver/tracepoint.c
> +++ b/gdb/gdbserver/tracepoint.c
> @@ -2377,6 +2377,13 @@ cmd_qtinit (char *packet)
>   {
>     struct trace_state_variable *tsv, *prev, *next;
>   
> +  /* Can't do this command without a pid attached */
> +  if (current_thread == NULL)
> +    {
> +      write_enn(packet);
> +      return;
> +    }
> +
>     /* Make sure we don't try to read from a trace frame.  */
>     current_traceframe = -1;
>   
> diff --git a/gdb/testsuite/gdb.server/Makefile.in b/gdb/testsuite/gdb.server/Makefile.in
> index 509fbd8..52fe957 100644
> --- a/gdb/testsuite/gdb.server/Makefile.in
> +++ b/gdb/testsuite/gdb.server/Makefile.in
> @@ -2,7 +2,7 @@ VPATH = @srcdir@
>   srcdir = @srcdir@
>   
>   EXECUTABLES = ext-attach ext-run file-transfer server-mon server-run \
> -	no-thread-db
> +	no-thread-db no-attach-trace
>   
>   MISCELLANEOUS =
>   
> diff --git a/gdb/testsuite/gdb.server/no-attach-trace.c b/gdb/testsuite/gdb.server/no-attach-trace.c
> new file mode 100644
> index 0000000..383e6d0
> --- /dev/null
> +++ b/gdb/testsuite/gdb.server/no-attach-trace.c
> @@ -0,0 +1,25 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2015 Free Software Foundation, Inc.
> +
> +   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 <http://www.gnu.org/licenses/>.  */
> +
> +/* This program is intended to be a simple dummy program for gdb to read */
> +
> +#include <unistd.h>
> +
> +int main ()
> +{
> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.server/no-attach-trace.exp b/gdb/testsuite/gdb.server/no-attach-trace.exp
> new file mode 100644
> index 0000000..ff75e44
> --- /dev/null
> +++ b/gdb/testsuite/gdb.server/no-attach-trace.exp
> @@ -0,0 +1,40 @@
> +# This testcase is part of GDB, the GNU debugger.
> +
> +# Copyright 2015 Free Software Foundation, Inc.
> +
> +# 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 <http://www.gnu.org/licenses/>.
> +
> +# Test that trying to trace without a program attached fails properly.
> +
> +load_lib gdbserver-support.exp
> +load_lib trace-support.exp
> +
> +standard_testfile
> +
> +if { [skip_gdbserver_tests] } {
> +    return 0
> +}
> +
> +if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
> +    return -1
> +}
> +
> +# Make sure we're disconnected, in case we're testing with an
> +# extended-remote board, therefore already connected.
> +gdb_test "disconnect" ".*"
> +
> +gdbserver_start_extended
> +
> +gdb_test "trace main" "Tracepoint.*"
> +gdb_test "tstart" "Target returns error code '01'\."
  
Luis Machado Feb. 5, 2015, 1:37 p.m. UTC | #2
On 02/05/2015 11:30 AM, Antoine Tremblay wrote:
> ping
>
> On 01/27/2015 02:35 PM, Antoine Tremblay wrote:
>> When gdbserver is called with --multi and attach has not been called yet
>> and tstart is called on the gdb client, gdbserver would crash.
>> This patch fixes gdbserver so that it returns E01 to the gdb client.

Wouldn't it make more sense to prevent GDB from sending any tracepoint 
packets that require a running inferior if there is none?

I remember fixing this in a local tree but on GDB's side. I think it is 
remote.c:remote_trace_init and other related functions.

What do you think?
  
Luis Machado Feb. 5, 2015, 1:44 p.m. UTC | #3
On 02/05/2015 11:37 AM, Luis Machado wrote:
> On 02/05/2015 11:30 AM, Antoine Tremblay wrote:
>> ping
>>
>> On 01/27/2015 02:35 PM, Antoine Tremblay wrote:
>>> When gdbserver is called with --multi and attach has not been called yet
>>> and tstart is called on the gdb client, gdbserver would crash.
>>> This patch fixes gdbserver so that it returns E01 to the gdb client.
>
> Wouldn't it make more sense to prevent GDB from sending any tracepoint
> packets that require a running inferior if there is none?
>
> I remember fixing this in a local tree but on GDB's side. I think it is
> remote.c:remote_trace_init and other related functions.
>
> What do you think?

I've looked around and found the patch in a local tree of mine. It fixes 
more cases of tracepoint commands that require a running inferior.

I could revive and submit it if it makes things easier.
  
Antoine Tremblay Feb. 5, 2015, 1:53 p.m. UTC | #4
Hi,
    I'm quite new to gdb, but in general I would argue that it's better 
to make a program resilient to wrong input then to sanitize the input, 
let's say someday something else then gdb would use gdbserver....?

    But I sure would like to take a look at your patch if you have it 
handy ?

    I'm not sure how to fix it on gdb's side yet...

On 02/05/2015 08:44 AM, Luis Machado wrote:
> On 02/05/2015 11:37 AM, Luis Machado wrote:
>> On 02/05/2015 11:30 AM, Antoine Tremblay wrote:
>>> ping
>>>
>>> On 01/27/2015 02:35 PM, Antoine Tremblay wrote:
>>>> When gdbserver is called with --multi and attach has not been 
>>>> called yet
>>>> and tstart is called on the gdb client, gdbserver would crash.
>>>> This patch fixes gdbserver so that it returns E01 to the gdb client.
>>
>> Wouldn't it make more sense to prevent GDB from sending any tracepoint
>> packets that require a running inferior if there is none?
>>
>> I remember fixing this in a local tree but on GDB's side. I think it is
>> remote.c:remote_trace_init and other related functions.
>>
>> What do you think?
>
> I've looked around and found the patch in a local tree of mine. It 
> fixes more cases of tracepoint commands that require a running inferior.
>
> I could revive and submit it if it makes things easier.
>
  
Luis Machado Feb. 5, 2015, 2:04 p.m. UTC | #5
On 02/05/2015 11:53 AM, Antoine Tremblay wrote:
> Hi,
>     I'm quite new to gdb, but in general I would argue that it's better
> to make a program resilient to wrong input then to sanitize the input,
> let's say someday something else then gdb would use gdbserver....?

It is certainly a valid concern.

>
>     But I sure would like to take a look at your patch if you have it
> handy ?

I just need to extract it from the tree and do a bit of an update. We 
could probably merge both to robustify the tracepoint mechanism.

> On 02/05/2015 08:44 AM, Luis Machado wrote:
>> On 02/05/2015 11:37 AM, Luis Machado wrote:
>>> On 02/05/2015 11:30 AM, Antoine Tremblay wrote:
>>>> ping
>>>>
>>>> On 01/27/2015 02:35 PM, Antoine Tremblay wrote:
>>>>> When gdbserver is called with --multi and attach has not been
>>>>> called yet
>>>>> and tstart is called on the gdb client, gdbserver would crash.
>>>>> This patch fixes gdbserver so that it returns E01 to the gdb client.
>>>
>>> Wouldn't it make more sense to prevent GDB from sending any tracepoint
>>> packets that require a running inferior if there is none?
>>>
>>> I remember fixing this in a local tree but on GDB's side. I think it is
>>> remote.c:remote_trace_init and other related functions.
>>>
>>> What do you think?
>>
>> I've looked around and found the patch in a local tree of mine. It
>> fixes more cases of tracepoint commands that require a running inferior.
>>
>> I could revive and submit it if it makes things easier.
>>
>
  
Antoine Tremblay Feb. 5, 2015, 2:06 p.m. UTC | #6
On 02/05/2015 09:04 AM, Luis Machado wrote:
> On 02/05/2015 11:53 AM, Antoine Tremblay wrote:
>> Hi,
>>     I'm quite new to gdb, but in general I would argue that it's better
>> to make a program resilient to wrong input then to sanitize the input,
>> let's say someday something else then gdb would use gdbserver....?
>
> It is certainly a valid concern.
>
>>
>>     But I sure would like to take a look at your patch if you have it
>> handy ?
>
> I just need to extract it from the tree and do a bit of an update. We 
> could probably merge both to robustify the tracepoint mechanism.
>
Yes that's sounds a good idea :)

Thanks!

>> On 02/05/2015 08:44 AM, Luis Machado wrote:
>>> On 02/05/2015 11:37 AM, Luis Machado wrote:
>>>> On 02/05/2015 11:30 AM, Antoine Tremblay wrote:
>>>>> ping
>>>>>
>>>>> On 01/27/2015 02:35 PM, Antoine Tremblay wrote:
>>>>>> When gdbserver is called with --multi and attach has not been
>>>>>> called yet
>>>>>> and tstart is called on the gdb client, gdbserver would crash.
>>>>>> This patch fixes gdbserver so that it returns E01 to the gdb client.
>>>>
>>>> Wouldn't it make more sense to prevent GDB from sending any tracepoint
>>>> packets that require a running inferior if there is none?
>>>>
>>>> I remember fixing this in a local tree but on GDB's side. I think 
>>>> it is
>>>> remote.c:remote_trace_init and other related functions.
>>>>
>>>> What do you think?
>>>
>>> I've looked around and found the patch in a local tree of mine. It
>>> fixes more cases of tracepoint commands that require a running 
>>> inferior.
>>>
>>> I could revive and submit it if it makes things easier.
>>>
>>
>
  
Pedro Alves Feb. 5, 2015, 5:35 p.m. UTC | #7
Agreed with both.  :-)

On the test, I think it could go under gdb.trace/, and not use
any of gdbserver_start_extended and friends.  That'd expose the
use case to all targets that can do tracing.  gdbserver's case
would be covered by running the testsuite with the
extended-remote board, which is now routinely run by the
GDB's Buildbot (https://sourceware.org/ml/gdb-testers/2015-q1/).

WDYT?

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 82d6ce5..0518530 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -2377,6 +2377,13 @@  cmd_qtinit (char *packet)
 {
   struct trace_state_variable *tsv, *prev, *next;
 
+  /* Can't do this command without a pid attached */
+  if (current_thread == NULL)
+    {
+      write_enn(packet);
+      return;
+    }
+
   /* Make sure we don't try to read from a trace frame.  */
   current_traceframe = -1;
 
diff --git a/gdb/testsuite/gdb.server/Makefile.in b/gdb/testsuite/gdb.server/Makefile.in
index 509fbd8..52fe957 100644
--- a/gdb/testsuite/gdb.server/Makefile.in
+++ b/gdb/testsuite/gdb.server/Makefile.in
@@ -2,7 +2,7 @@  VPATH = @srcdir@
 srcdir = @srcdir@
 
 EXECUTABLES = ext-attach ext-run file-transfer server-mon server-run \
-	no-thread-db
+	no-thread-db no-attach-trace
 
 MISCELLANEOUS =
 
diff --git a/gdb/testsuite/gdb.server/no-attach-trace.c b/gdb/testsuite/gdb.server/no-attach-trace.c
new file mode 100644
index 0000000..383e6d0
--- /dev/null
+++ b/gdb/testsuite/gdb.server/no-attach-trace.c
@@ -0,0 +1,25 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2015 Free Software Foundation, Inc.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+/* This program is intended to be a simple dummy program for gdb to read */
+
+#include <unistd.h>
+
+int main ()
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.server/no-attach-trace.exp b/gdb/testsuite/gdb.server/no-attach-trace.exp
new file mode 100644
index 0000000..ff75e44
--- /dev/null
+++ b/gdb/testsuite/gdb.server/no-attach-trace.exp
@@ -0,0 +1,40 @@ 
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2015 Free Software Foundation, Inc.
+
+# 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 <http://www.gnu.org/licenses/>.
+
+# Test that trying to trace without a program attached fails properly.
+
+load_lib gdbserver-support.exp
+load_lib trace-support.exp
+
+standard_testfile
+
+if { [skip_gdbserver_tests] } {
+    return 0
+}
+
+if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
+    return -1
+}
+
+# Make sure we're disconnected, in case we're testing with an
+# extended-remote board, therefore already connected.
+gdb_test "disconnect" ".*"
+
+gdbserver_start_extended
+
+gdb_test "trace main" "Tracepoint.*"
+gdb_test "tstart" "Target returns error code '01'\."