From f7bb4e3a0d3738e8cce3dcded6ef12c9949cb85f Mon Sep 17 00:00:00 2001 From: Peter Bergner Date: Tue, 7 Mar 2017 09:49:10 -0600 Subject: [PATCH] GDB: Fix some null pointer dereferences due to disassembler-options patch. gdb/ * gdbarch.sh (pstring_ptr): New static function. (gdbarch_disassembler_options): Use it. (gdbarch_verify_disassembler_options): Print valid_disassembler_options, not valid_disassembler_option->name. * gdbarch.c: Regenerate. --- gdb/ChangeLog | 8 ++++++++ gdb/gdbarch.c | 12 ++++++++++-- gdb/gdbarch.sh | 12 ++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f63c09cc80e..2427b103299 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-03-07 Peter Bergner + + * gdbarch.sh (pstring_ptr): New static function. + (gdbarch_disassembler_options): Use it. + (gdbarch_verify_disassembler_options): Print valid_disassembler_options, + not valid_disassembler_option->name. + * gdbarch.c: Regenerate. + 2017-03-07 Peter Bergner * config/powerpc/ppc64-linux.mh (MH_CFLAGS): Delete. diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index f52cf5d698b..87eafb2ab65 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -84,6 +84,14 @@ pstring (const char *string) return string; } +static char * +pstring_ptr (char **string) +{ + if (string == NULL || *string == NULL) + return "(null)"; + return *string; +} + /* Helper function to print a list of strings, represented as "const char *const *". The list is printed comma-separated. */ @@ -880,7 +888,7 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) core_addr_to_string_nz (gdbarch->deprecated_function_start_offset)); fprintf_unfiltered (file, "gdbarch_dump: disassembler_options = %s\n", - pstring (*gdbarch->disassembler_options)); + pstring_ptr (gdbarch->disassembler_options)); fprintf_unfiltered (file, "gdbarch_dump: gdbarch_displaced_step_copy_insn_p() = %d\n", gdbarch_displaced_step_copy_insn_p (gdbarch)); @@ -1429,7 +1437,7 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) host_address_to_string (gdbarch->unwind_sp)); fprintf_unfiltered (file, "gdbarch_dump: valid_disassembler_options = %s\n", - host_address_to_string (gdbarch->valid_disassembler_options->name)); + host_address_to_string (gdbarch->valid_disassembler_options)); fprintf_unfiltered (file, "gdbarch_dump: value_from_register = <%s>\n", host_address_to_string (gdbarch->value_from_register)); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 6902e0e34d2..39b1f9477c2 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1164,8 +1164,8 @@ m:const char *:gnu_triplet_regexp:void:::default_gnu_triplet_regexp::0 m:int:addressable_memory_unit_size:void:::default_addressable_memory_unit_size::0 # Functions for allowing a target to modify its disassembler options. -v:char **:disassembler_options:::0:0::0:pstring (*gdbarch->disassembler_options) -v:const disasm_options_t *:valid_disassembler_options:::0:0::0:host_address_to_string (gdbarch->valid_disassembler_options->name) +v:char **:disassembler_options:::0:0::0:pstring_ptr (gdbarch->disassembler_options) +v:const disasm_options_t *:valid_disassembler_options:::0:0::0:host_address_to_string (gdbarch->valid_disassembler_options) EOF } @@ -1678,6 +1678,14 @@ pstring (const char *string) return string; } +static char * +pstring_ptr (char **string) +{ + if (string == NULL || *string == NULL) + return "(null)"; + return *string; +} + /* Helper function to print a list of strings, represented as "const char *const *". The list is printed comma-separated. */ -- 2.30.2