From b0ed115fa5895ccb20d73e26d89a3b8430fe0f0a Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 11 Jul 2014 08:30:34 -0600 Subject: [PATCH] fix PR gdb/17130 This fixes PR gdb/17130. The bug is that some code in utils.c was not updated during the target delegation change: if (job_control /* If there is no terminal switching for this target, then we can't possibly get screwed by the lack of job control. */ || current_target.to_terminal_ours == NULL) fatal ("Quit"); else fatal ("Quit (expect signal SIGINT when the program is resumed)"); After the delegation change, to_terminal_ours will never be NULL. I think this bug can be seen before the target delegation change by enabling target debugging -- this would also cause to_terminal_ours to be non-NULL. The fix is to introduce a new target_supports_terminal_ours function, that properly checks the target stack. This is not perhaps ideal, but I think is a reasonable-enough approach, and in keeping with some other existing code of the same form. This patch also fixes a similar bug in target_supports_delete_record. 2014-07-18 Tom Tromey PR gdb/17130: * utils.c (quit): Use target_supports_terminal_ours. * target.h (target_supports_terminal_ours): Declare. * target.c (target_supports_delete_record): Don't check to_delete_record against NULL. (target_supports_terminal_ours): New function. --- gdb/ChangeLog | 9 +++++++++ gdb/target.c | 20 +++++++++++++++++++- gdb/target.h | 5 +++++ gdb/utils.c | 2 +- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ffecd79..f29d399 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,6 +1,15 @@ 2014-07-18 Tom Tromey PR gdb/17130: + * utils.c (quit): Use target_supports_terminal_ours. + * target.h (target_supports_terminal_ours): Declare. + * target.c (target_supports_delete_record): Don't check + to_delete_record against NULL. + (target_supports_terminal_ours): New function. + +2014-07-18 Tom Tromey + + PR gdb/17130: * spu-multiarch.c (spu_region_ok_for_hw_watchpoint) (spu_fetch_registers, spu_store_registers, spu_xfer_partial) (spu_search_memory, spu_mourn_inferior): Simplify delegation. diff --git a/gdb/target.c b/gdb/target.c index 07d029a..d77542a 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -499,6 +499,23 @@ target_terminal_inferior (void) (*current_target.to_terminal_inferior) (¤t_target); } +/* See target.h. */ + +int +target_supports_terminal_ours (void) +{ + struct target_ops *t; + + for (t = current_target.beneath; t != NULL; t = t->beneath) + { + if (t->to_terminal_ours != delegate_terminal_ours + && t->to_terminal_ours != tdefault_terminal_ours) + return 1; + } + + return 0; +} + static void tcomplain (void) { @@ -3457,7 +3474,8 @@ target_supports_delete_record (void) struct target_ops *t; for (t = current_target.beneath; t != NULL; t = t->beneath) - if (t->to_delete_record != NULL) + if (t->to_delete_record != delegate_delete_record + && t->to_delete_record != tdefault_delete_record) return 1; return 0; diff --git a/gdb/target.h b/gdb/target.h index 8c8ce00..35a7d7d 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1397,6 +1397,11 @@ extern void target_terminal_inferior (void); #define target_terminal_ours() \ (*current_target.to_terminal_ours) (¤t_target) +/* Return true if the target stack has a non-default + "to_terminal_ours" method. */ + +extern int target_supports_terminal_ours (void); + /* Save our terminal settings. This is called from TUI after entering or leaving the curses mode. Since curses modifies our terminal this call is here diff --git a/gdb/utils.c b/gdb/utils.c index d324227..a9e8196 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -1095,7 +1095,7 @@ quit (void) if (job_control /* If there is no terminal switching for this target, then we can't possibly get screwed by the lack of job control. */ - || current_target.to_terminal_ours == NULL) + || !target_supports_terminal_ours ()) fatal ("Quit"); else fatal ("Quit (expect signal SIGINT when the program is resumed)"); -- 2.7.4