This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Fix null dereference SEGV during 'maint print arch' caused by the disassembler-options patch
- From: Peter Bergner <bergner at vnet dot ibm dot com>
- To: gdb-patches at sourceware dot org
- Cc: Jan Kratochvil <jkratoch at redhat dot com>, Ulrich Weigand <uweigand at de dot ibm dot com>, Pedro Alves <palves at redhat dot com>
- Date: Mon, 6 Mar 2017 13:50:23 -0600
- Subject: [PATCH] Fix null dereference SEGV during 'maint print arch' caused by the disassembler-options patch
- Authentication-results: sourceware.org; auth=none
The change of disassembler_options from a char * to a char **, led to a NULL
pointer reference when we do a "maint print arch" command on architectures
that do not support "set/show disassembler-options ..." (eg, x86).
The following patch adds a pstring_ptr() routine which can dump the
current set of disassembler options without segv'ing. Fixing that exposed
a similar issue with the valid_disassembler_options field. I solved that
but dumping the address of the valid_disassembler_options struct rather
than its "name" field.
Ok for trunk?
Peter
* 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.
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
index 6902e0e..39b1f94 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. */
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index f52cf5d..87eafb2 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));