Security fix for loading untrusted inferiors, see "set auto-load" (BZ 756117).
This commit is contained in:
parent
ab6e61f8eb
commit
dcb8ac2042
|
@ -1,243 +0,0 @@
|
|||
http://sourceware.org/ml/gdb-patches/2005-05/threads.html#00637
|
||||
Proposed upstream but never committed upstream.
|
||||
|
||||
2005-06-09 Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* gdb.base/gdbinit.exp: New testcase.
|
||||
* gdb.base/gdbinit.sample: Sample .gdbinit for gdbinit.exp.
|
||||
|
||||
2005-06-08 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* Makefile.in (cli-cmds.o): Update.
|
||||
* configure.in: Add check for getuid.
|
||||
* configure: Regenerated.
|
||||
* config.in: Ditto.
|
||||
* main.c (captured_main): Pass -1 to source_command when loading
|
||||
gdbinit files.
|
||||
* cli/cli-cmds.c: Include "gdb_stat.h" and <fcntl.h>.
|
||||
(source_command): Update documentation. Check permissions if
|
||||
FROM_TTY is -1.
|
||||
|
||||
Index: gdb-7.2.50.20101231/gdb/cli/cli-cmds.c
|
||||
===================================================================
|
||||
--- gdb-7.2.50.20101231.orig/gdb/cli/cli-cmds.c 2010-12-29 03:11:04.000000000 +0100
|
||||
+++ gdb-7.2.50.20101231/gdb/cli/cli-cmds.c 2011-01-01 00:53:51.000000000 +0100
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "source.h"
|
||||
#include "disasm.h"
|
||||
#include "tracepoint.h"
|
||||
+#include "gdb_stat.h"
|
||||
|
||||
#include "ui-out.h"
|
||||
|
||||
@@ -488,7 +489,7 @@ Script filename extension recognition is
|
||||
|
||||
int
|
||||
find_and_open_script (const char *script_file, int search_path,
|
||||
- FILE **streamp, char **full_pathp)
|
||||
+ FILE **streamp, char **full_pathp, int from_tty)
|
||||
{
|
||||
char *file;
|
||||
int fd;
|
||||
@@ -514,6 +515,32 @@ find_and_open_script (const char *script
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#ifdef HAVE_GETUID
|
||||
+ if (from_tty == -1)
|
||||
+ {
|
||||
+ struct stat statbuf;
|
||||
+
|
||||
+ if (fstat (fd, &statbuf) < 0)
|
||||
+ {
|
||||
+ int save_errno = errno;
|
||||
+
|
||||
+ close (fd);
|
||||
+ do_cleanups (old_cleanups);
|
||||
+ errno = save_errno;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (statbuf.st_uid != getuid () || (statbuf.st_mode & S_IWOTH))
|
||||
+ {
|
||||
+ /* FILE gets freed by do_cleanups (old_cleanups). */
|
||||
+ warning (_("not using untrusted file \"%s\""), file);
|
||||
+ close (fd);
|
||||
+ do_cleanups (old_cleanups);
|
||||
+ errno = EPERM;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
do_cleanups (old_cleanups);
|
||||
|
||||
*streamp = fdopen (fd, FOPEN_RT);
|
||||
@@ -573,13 +600,14 @@ source_script_with_search (const char *f
|
||||
if (file == NULL || *file == 0)
|
||||
error (_("source command requires file name of file to source."));
|
||||
|
||||
- if (!find_and_open_script (file, search_path, &stream, &full_path))
|
||||
+ if (!find_and_open_script (file, search_path, &stream, &full_path,
|
||||
+ from_tty))
|
||||
{
|
||||
/* The script wasn't found, or was otherwise inaccessible.
|
||||
If the source command was invoked interactively, throw an
|
||||
error. Otherwise (e.g. if it was invoked by a script),
|
||||
silently ignore the error. */
|
||||
- if (from_tty)
|
||||
+ if (from_tty > 0)
|
||||
perror_with_name (file);
|
||||
else
|
||||
return;
|
||||
Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.exp 2011-01-01 00:53:09.000000000 +0100
|
||||
@@ -0,0 +1,91 @@
|
||||
+# Copyright 2005
|
||||
+# 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 2 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, write to the Free Software
|
||||
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+
|
||||
+# Please email any bugs, comments, and/or additions to this file to:
|
||||
+# bug-gdb@prep.ai.mit.edu
|
||||
+
|
||||
+# This file was written by Jeff Johnston <jjohnstn@redhat.com>.
|
||||
+
|
||||
+# are we on a target board
|
||||
+if [is_remote target] {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+
|
||||
+global verbose
|
||||
+global GDB
|
||||
+global GDBFLAGS
|
||||
+global gdb_prompt
|
||||
+global timeout
|
||||
+global gdb_spawn_id;
|
||||
+
|
||||
+gdb_stop_suppressing_tests;
|
||||
+
|
||||
+verbose "Spawning $GDB -nw"
|
||||
+
|
||||
+if [info exists gdb_spawn_id] {
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+if ![is_remote host] {
|
||||
+ if { [which $GDB] == 0 } then {
|
||||
+ perror "$GDB does not exist."
|
||||
+ exit 1
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+set env(HOME) [pwd]
|
||||
+remote_exec build "rm .gdbinit"
|
||||
+remote_exec build "cp ${srcdir}/${subdir}/gdbinit.sample .gdbinit"
|
||||
+remote_exec build "chmod 646 .gdbinit"
|
||||
+
|
||||
+set res [remote_spawn host "$GDB -nw [host_info gdb_opts]"];
|
||||
+if { $res < 0 || $res == "" } {
|
||||
+ perror "Spawning $GDB failed."
|
||||
+ return 1;
|
||||
+}
|
||||
+gdb_expect 360 {
|
||||
+ -re "warning: not using untrusted file.*\.gdbinit.*\[\r\n\]$gdb_prompt $" {
|
||||
+ pass "untrusted .gdbinit caught."
|
||||
+ }
|
||||
+ -re "$gdb_prompt $" {
|
||||
+ fail "untrusted .gdbinit caught."
|
||||
+ }
|
||||
+ timeout {
|
||||
+ fail "(timeout) untrusted .gdbinit caught."
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+remote_exec build "chmod 644 .gdbinit"
|
||||
+set res [remote_spawn host "$GDB -nw [host_info gdb_opts]"];
|
||||
+if { $res < 0 || $res == "" } {
|
||||
+ perror "Spawning $GDB failed."
|
||||
+ return 1;
|
||||
+}
|
||||
+gdb_expect 360 {
|
||||
+ -re "warning: not using untrusted file.*\.gdbinit.*\[\r\n\]$gdb_prompt $" {
|
||||
+ fail "trusted .gdbinit allowed."
|
||||
+ }
|
||||
+ -re "in gdbinit.*$gdb_prompt $" {
|
||||
+ pass "trusted .gdbinit allowed."
|
||||
+ }
|
||||
+ timeout {
|
||||
+ fail "(timeout) trusted .gdbinit allowed."
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+remote_exec build "rm .gdbinit"
|
||||
Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.sample
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.sample 2011-01-01 00:53:09.000000000 +0100
|
||||
@@ -0,0 +1 @@
|
||||
+echo "\nin gdbinit"
|
||||
Index: gdb-7.2.50.20101231/gdb/main.c
|
||||
===================================================================
|
||||
--- gdb-7.2.50.20101231.orig/gdb/main.c 2010-12-29 01:58:14.000000000 +0100
|
||||
+++ gdb-7.2.50.20101231/gdb/main.c 2011-01-01 00:53:09.000000000 +0100
|
||||
@@ -805,7 +805,7 @@ Excess command line arguments ignored. (
|
||||
debugging or what directory you are in. */
|
||||
|
||||
if (home_gdbinit && !inhibit_gdbinit)
|
||||
- catch_command_errors (source_script, home_gdbinit, 0, RETURN_MASK_ALL);
|
||||
+ catch_command_errors (source_script, home_gdbinit, -1, RETURN_MASK_ALL);
|
||||
|
||||
/* Now perform all the actions indicated by the arguments. */
|
||||
if (cdarg != NULL)
|
||||
@@ -880,7 +880,7 @@ Can't attach to process and specify a co
|
||||
/* Read the .gdbinit file in the current directory, *if* it isn't
|
||||
the same as the $HOME/.gdbinit file (it should exist, also). */
|
||||
if (local_gdbinit && !inhibit_gdbinit)
|
||||
- catch_command_errors (source_script, local_gdbinit, 0, RETURN_MASK_ALL);
|
||||
+ catch_command_errors (source_script, local_gdbinit, -1, RETURN_MASK_ALL);
|
||||
|
||||
/* Now that all .gdbinit's have been read and all -d options have been
|
||||
processed, we can read any scripts mentioned in SYMARG.
|
||||
Index: gdb-7.2.50.20101231/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.2.50.20101231.orig/gdb/python/py-auto-load.c 2010-12-15 18:27:59.000000000 +0100
|
||||
+++ gdb-7.2.50.20101231/gdb/python/py-auto-load.c 2011-01-01 00:53:09.000000000 +0100
|
||||
@@ -224,7 +224,7 @@ source_section_scripts (struct objfile *
|
||||
}
|
||||
|
||||
opened = find_and_open_script (file, 1 /*search_path*/,
|
||||
- &stream, &full_path);
|
||||
+ &stream, &full_path, 1 /* from_tty */);
|
||||
|
||||
/* If the file is not found, we still record the file in the hash table,
|
||||
we only want to print an error message once.
|
||||
Index: gdb-7.2.50.20101231/gdb/cli/cli-cmds.h
|
||||
===================================================================
|
||||
--- gdb-7.2.50.20101231.orig/gdb/cli/cli-cmds.h 2010-12-29 03:11:04.000000000 +0100
|
||||
+++ gdb-7.2.50.20101231/gdb/cli/cli-cmds.h 2011-01-01 00:53:09.000000000 +0100
|
||||
@@ -126,7 +126,8 @@ extern void source_script (char *, int);
|
||||
/* Exported to objfiles.c. */
|
||||
|
||||
extern int find_and_open_script (const char *file, int search_path,
|
||||
- FILE **streamp, char **full_path);
|
||||
+ FILE **streamp, char **full_path,
|
||||
+ int from_tty);
|
||||
|
||||
/* Command tracing state. */
|
||||
|
|
@ -0,0 +1,677 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-05/msg00101.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/05/13 22:07:56 1.13005
|
||||
### src/gdb/ChangeLog 2011/05/13 22:11:45 1.13006
|
||||
## -1,3 +1,24 @@
|
||||
+2011-05-13 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * NEWS: Mention "info auto-load-scripts".
|
||||
+ * python/py-auto-load.c (struct auto_load_pspace_info): New member
|
||||
+ script_not_found_warning_printed.
|
||||
+ (init_loaded_scripts_info): Renamed from create_loaded_scripts_hash,
|
||||
+ all callers updated. Initialize script_not_found_warning_printed.
|
||||
+ (get_auto_load_pspace_data_for_loading): New function.
|
||||
+ (maybe_add_script): New function.
|
||||
+ (source_section_scripts): Simplify. Only print one warning regardless
|
||||
+ of the number of auto-load scripts not found.
|
||||
+ (clear_section_scripts): Clear script_not_found_warning_printed.
|
||||
+ (auto_load_objfile_script): Record script in hash table.
|
||||
+ (count_matching_scripts): New function.
|
||||
+ (maybe_print_script): Renamed from maybe_print_section_script, all
|
||||
+ callers updated. Rewrite to use ui_out_*.
|
||||
+ (info_auto_load_scripts): Renamed from
|
||||
+ maintenance_print_section_scripts, all callers updated.
|
||||
+ (gdbpy_initialize_auto_load): "maintenance print section-scripts"
|
||||
+ renamed as "info auto-load-scripts".
|
||||
+
|
||||
2011-05-13 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* dwarf2expr.c (read_uleb128): Cast intermediate result.
|
||||
Index: gdb-7.3.1/gdb/NEWS
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/NEWS 2012-04-20 22:33:54.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/NEWS 2012-04-20 22:34:14.280929212 +0200
|
||||
@@ -8,6 +8,10 @@
|
||||
'data-directory'/python/gdb/function are now automatically loaded
|
||||
on GDB start-up.
|
||||
|
||||
+info auto-load-scripts [REGEXP]
|
||||
+ This command was formerly named "maintenance print section-scripts".
|
||||
+ It is now generally useful and is no longer a maintenance-only command.
|
||||
+
|
||||
*** Changes in GDB 7.3.1
|
||||
|
||||
* The build failure for NetBSD and OpenBSD targets have now been fixed.
|
||||
Index: gdb-7.3.1/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/doc/gdb.texinfo 2012-04-20 22:33:54.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/doc/gdb.texinfo 2012-04-20 22:34:03.663955649 +0200
|
||||
@@ -23673,7 +23673,8 @@ command, or because the inferior has loa
|
||||
The auto-loading feature is useful for supplying application-specific
|
||||
debugging commands and scripts.
|
||||
|
||||
-Auto-loading can be enabled or disabled.
|
||||
+Auto-loading can be enabled or disabled,
|
||||
+and the list of auto-loaded scripts can be printed.
|
||||
|
||||
@table @code
|
||||
@kindex set auto-load-scripts
|
||||
@@ -23683,6 +23684,19 @@ Enable or disable the auto-loading of Py
|
||||
@kindex show auto-load-scripts
|
||||
@item show auto-load-scripts
|
||||
Show whether auto-loading of Python scripts is enabled or disabled.
|
||||
+
|
||||
+@kindex info auto-load-scripts
|
||||
+@cindex print list of auto-loaded scripts
|
||||
+@item info auto-load-scripts [@var{regexp}]
|
||||
+Print the list of all scripts that gdb auto-loaded, or tried to auto-load.
|
||||
+If @var{regexp} is supplied only scripts with matching names are printed.
|
||||
+
|
||||
+@smallexample
|
||||
+(gdb) info auto-load-scripts
|
||||
+Loaded Script
|
||||
+ Yes py-section-script.py
|
||||
+ full name: /tmp/py-section-script.py
|
||||
+@end smallexample
|
||||
@end table
|
||||
|
||||
When reading an auto-loaded file, @value{GDBN} sets the
|
||||
Index: gdb-7.3.1/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/python/py-auto-load.c 2011-01-06 01:57:04.000000000 +0100
|
||||
+++ gdb-7.3.1/gdb/python/py-auto-load.c 2012-04-20 22:34:03.664955646 +0200
|
||||
@@ -18,6 +18,7 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "defs.h"
|
||||
+#include "filenames.h"
|
||||
#include "gdb_string.h"
|
||||
#include "gdb_regex.h"
|
||||
#include "top.h"
|
||||
@@ -68,11 +69,15 @@ struct auto_load_pspace_info
|
||||
{
|
||||
/* For each program space we keep track of loaded scripts. */
|
||||
struct htab *loaded_scripts;
|
||||
+
|
||||
+ /* Non-zero if we've issued the warning about an auto-load script not being
|
||||
+ found. We only want to issue this warning once. */
|
||||
+ int script_not_found_warning_printed;
|
||||
};
|
||||
|
||||
/* Objects of this type are stored in the loaded script hash table. */
|
||||
|
||||
-struct loaded_script_entry
|
||||
+struct loaded_script
|
||||
{
|
||||
/* Name as provided by the objfile. */
|
||||
const char *name;
|
||||
@@ -132,7 +137,7 @@ get_auto_load_pspace_data (struct progra
|
||||
static hashval_t
|
||||
hash_loaded_script_entry (const void *data)
|
||||
{
|
||||
- const struct loaded_script_entry *e = data;
|
||||
+ const struct loaded_script *e = data;
|
||||
|
||||
return htab_hash_string (e->name);
|
||||
}
|
||||
@@ -142,17 +147,17 @@ hash_loaded_script_entry (const void *da
|
||||
static int
|
||||
eq_loaded_script_entry (const void *a, const void *b)
|
||||
{
|
||||
- const struct loaded_script_entry *ea = a;
|
||||
- const struct loaded_script_entry *eb = b;
|
||||
+ const struct loaded_script *ea = a;
|
||||
+ const struct loaded_script *eb = b;
|
||||
|
||||
return strcmp (ea->name, eb->name) == 0;
|
||||
}
|
||||
|
||||
-/* Create the hash table used for loaded scripts.
|
||||
+/* Initialize the table to track loaded scripts.
|
||||
Each entry is hashed by the full path name. */
|
||||
|
||||
static void
|
||||
-create_loaded_scripts_hash (struct auto_load_pspace_info *pspace_info)
|
||||
+init_loaded_scripts_info (struct auto_load_pspace_info *pspace_info)
|
||||
{
|
||||
/* Choose 31 as the starting size of the hash table, somewhat arbitrarily.
|
||||
Space for each entry is obtained with one malloc so we can free them
|
||||
@@ -162,6 +167,64 @@ create_loaded_scripts_hash (struct auto_
|
||||
hash_loaded_script_entry,
|
||||
eq_loaded_script_entry,
|
||||
xfree);
|
||||
+
|
||||
+ pspace_info->script_not_found_warning_printed = FALSE;
|
||||
+}
|
||||
+
|
||||
+/* Wrapper on get_auto_load_pspace_data to also allocate the hash table
|
||||
+ for loading scripts. */
|
||||
+
|
||||
+static struct auto_load_pspace_info *
|
||||
+get_auto_load_pspace_data_for_loading (struct program_space *pspace)
|
||||
+{
|
||||
+ struct auto_load_pspace_info *info;
|
||||
+
|
||||
+ info = get_auto_load_pspace_data (pspace);
|
||||
+ if (info->loaded_scripts == NULL)
|
||||
+ init_loaded_scripts_info (info);
|
||||
+
|
||||
+ return info;
|
||||
+}
|
||||
+
|
||||
+/* Add script NAME to hash table HTAB.
|
||||
+ FULL_PATH is NULL if the script wasn't found.
|
||||
+ The result is true if the script was already in the hash table. */
|
||||
+
|
||||
+static int
|
||||
+maybe_add_script (struct htab *htab, const char *name, const char *full_path)
|
||||
+{
|
||||
+ struct loaded_script **slot, entry;
|
||||
+ int in_hash_table;
|
||||
+
|
||||
+ entry.name = name;
|
||||
+ entry.full_path = full_path;
|
||||
+ slot = (struct loaded_script **) htab_find_slot (htab, &entry, INSERT);
|
||||
+ in_hash_table = *slot != NULL;
|
||||
+
|
||||
+ /* If this script is not in the hash table, add it. */
|
||||
+
|
||||
+ if (! in_hash_table)
|
||||
+ {
|
||||
+ char *p;
|
||||
+
|
||||
+ /* Allocate all space in one chunk so it's easier to free. */
|
||||
+ *slot = xmalloc (sizeof (**slot)
|
||||
+ + strlen (name) + 1
|
||||
+ + (full_path != NULL ? (strlen (full_path) + 1) : 0));
|
||||
+ p = ((char*) *slot) + sizeof (**slot);
|
||||
+ strcpy (p, name);
|
||||
+ (*slot)->name = p;
|
||||
+ if (full_path != NULL)
|
||||
+ {
|
||||
+ p += strlen (p) + 1;
|
||||
+ strcpy (p, full_path);
|
||||
+ (*slot)->full_path = p;
|
||||
+ }
|
||||
+ else
|
||||
+ (*slot)->full_path = NULL;
|
||||
+ }
|
||||
+
|
||||
+ return in_hash_table;
|
||||
}
|
||||
|
||||
/* Load scripts specified in OBJFILE.
|
||||
@@ -182,11 +245,8 @@ source_section_scripts (struct objfile *
|
||||
{
|
||||
const char *p;
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
- struct loaded_script_entry **slot, entry;
|
||||
|
||||
- pspace_info = get_auto_load_pspace_data (current_program_space);
|
||||
- if (pspace_info->loaded_scripts == NULL)
|
||||
- create_loaded_scripts_hash (pspace_info);
|
||||
+ pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
|
||||
|
||||
for (p = start; p < end; ++p)
|
||||
{
|
||||
@@ -226,51 +286,29 @@ source_section_scripts (struct objfile *
|
||||
opened = find_and_open_script (file, 1 /*search_path*/,
|
||||
&stream, &full_path);
|
||||
|
||||
- /* If the file is not found, we still record the file in the hash table,
|
||||
- we only want to print an error message once.
|
||||
- IWBN if complaints.c were more general-purpose. */
|
||||
+ /* If one script isn't found it's not uncommon for more to not be
|
||||
+ found either. We don't want to print an error message for each
|
||||
+ script, too much noise. Instead, we print the warning once and tell
|
||||
+ the user how to find the list of scripts that weren't loaded.
|
||||
|
||||
- entry.name = file;
|
||||
- if (opened)
|
||||
- entry.full_path = full_path;
|
||||
- else
|
||||
- entry.full_path = NULL;
|
||||
- slot = ((struct loaded_script_entry **)
|
||||
- htab_find_slot (pspace_info->loaded_scripts,
|
||||
- &entry, INSERT));
|
||||
- in_hash_table = *slot != NULL;
|
||||
-
|
||||
- /* If this file is not in the hash table, add it. */
|
||||
- if (! in_hash_table)
|
||||
- {
|
||||
- char *p;
|
||||
+ IWBN if complaints.c were more general-purpose. */
|
||||
|
||||
- *slot = xmalloc (sizeof (**slot)
|
||||
- + strlen (file) + 1
|
||||
- + (opened ? (strlen (full_path) + 1) : 0));
|
||||
- p = ((char*) *slot) + sizeof (**slot);
|
||||
- strcpy (p, file);
|
||||
- (*slot)->name = p;
|
||||
- if (opened)
|
||||
- {
|
||||
- p += strlen (p) + 1;
|
||||
- strcpy (p, full_path);
|
||||
- (*slot)->full_path = p;
|
||||
- }
|
||||
- else
|
||||
- (*slot)->full_path = NULL;
|
||||
- }
|
||||
+ in_hash_table = maybe_add_script (pspace_info->loaded_scripts, file,
|
||||
+ opened ? full_path : NULL);
|
||||
|
||||
if (opened)
|
||||
free (full_path);
|
||||
|
||||
if (! opened)
|
||||
{
|
||||
- /* We don't throw an error, the program is still debuggable.
|
||||
- Check in_hash_table to only print the warning once. */
|
||||
- if (! in_hash_table)
|
||||
- warning (_("%s (referenced in %s): %s"),
|
||||
- file, GDBPY_AUTO_SECTION_NAME, safe_strerror (errno));
|
||||
+ /* We don't throw an error, the program is still debuggable. */
|
||||
+ if (! pspace_info->script_not_found_warning_printed)
|
||||
+ {
|
||||
+ warning (_("Missing auto-load scripts referenced in %s.\n\
|
||||
+Use `info auto-load-scripts [REGEXP]' to list them."),
|
||||
+ GDBPY_AUTO_SECTION_NAME);
|
||||
+ pspace_info->script_not_found_warning_printed = TRUE;
|
||||
+ }
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -322,6 +360,7 @@ clear_section_scripts (void)
|
||||
{
|
||||
htab_delete (info->loaded_scripts);
|
||||
info->loaded_scripts = NULL;
|
||||
+ info->script_not_found_warning_printed = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -378,6 +417,19 @@ auto_load_objfile_script (struct objfile
|
||||
|
||||
if (input)
|
||||
{
|
||||
+ struct auto_load_pspace_info *pspace_info;
|
||||
+
|
||||
+ /* Add this script to the hash table too so "info auto-load-scripts"
|
||||
+ can print it. */
|
||||
+ pspace_info =
|
||||
+ get_auto_load_pspace_data_for_loading (current_program_space);
|
||||
+ maybe_add_script (pspace_info->loaded_scripts, debugfile, debugfile);
|
||||
+
|
||||
+ /* To preserve existing behaviour we don't check for whether the
|
||||
+ script was already in the table, and always load it.
|
||||
+ It's highly unlikely that we'd ever load it twice,
|
||||
+ and these scripts are required to be idempotent under multiple
|
||||
+ loads anyway. */
|
||||
source_python_script_for_objfile (objfile, input, debugfile);
|
||||
fclose (input);
|
||||
}
|
||||
@@ -416,56 +468,133 @@ load_auto_scripts_for_objfile (struct ob
|
||||
}
|
||||
}
|
||||
|
||||
+/* Collect scripts to be printed in a vec. */
|
||||
+
|
||||
+typedef struct loaded_script *loaded_script_ptr;
|
||||
+DEF_VEC_P (loaded_script_ptr);
|
||||
+
|
||||
/* Traversal function for htab_traverse.
|
||||
- Print the entry if specified in the regex. */
|
||||
+ Collect the entry if it matches the regexp. */
|
||||
|
||||
static int
|
||||
-maybe_print_section_script (void **slot, void *info)
|
||||
+collect_matching_scripts (void **slot, void *info)
|
||||
+{
|
||||
+ struct loaded_script *script = *slot;
|
||||
+ VEC (loaded_script_ptr) *scripts = info;
|
||||
+
|
||||
+ if (re_exec (script->name))
|
||||
+ VEC_safe_push (loaded_script_ptr, scripts, script);
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+/* Print SCRIPT. */
|
||||
+
|
||||
+static void
|
||||
+print_script (struct loaded_script *script)
|
||||
{
|
||||
- struct loaded_script_entry *entry = *slot;
|
||||
+ struct cleanup *chain;
|
||||
+
|
||||
+ chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
|
||||
|
||||
- if (re_exec (entry->name))
|
||||
+ ui_out_field_string (uiout, "loaded", script->full_path ? "Yes" : "No");
|
||||
+ ui_out_field_string (uiout, "script", script->name);
|
||||
+ ui_out_text (uiout, "\n");
|
||||
+
|
||||
+ /* If the name isn't the full path, print it too. */
|
||||
+ if (script->full_path != NULL
|
||||
+ && strcmp (script->name, script->full_path) != 0)
|
||||
{
|
||||
- printf_filtered (_("Script name: %s\n"), entry->name);
|
||||
- printf_filtered (_(" Full name: %s\n"),
|
||||
- entry->full_path ? entry->full_path : _("unknown"));
|
||||
+ ui_out_text (uiout, "\tfull name: ");
|
||||
+ ui_out_field_string (uiout, "full_path", script->full_path);
|
||||
+ ui_out_text (uiout, "\n");
|
||||
}
|
||||
|
||||
- return 1;
|
||||
+ do_cleanups (chain);
|
||||
}
|
||||
|
||||
-/* "maint print section-scripts" command. */
|
||||
+/* Helper for info_auto_load_scripts to sort the scripts by name. */
|
||||
+
|
||||
+static int
|
||||
+sort_scripts_by_name (const void *ap, const void *bp)
|
||||
+{
|
||||
+ const struct loaded_script *a = *(const struct loaded_script **) ap;
|
||||
+ const struct loaded_script *b = *(const struct loaded_script **) bp;
|
||||
+
|
||||
+ return FILENAME_CMP (a->name, b->name);
|
||||
+}
|
||||
+
|
||||
+/* "info auto-load-scripts" command. */
|
||||
|
||||
static void
|
||||
-maintenance_print_section_scripts (char *pattern, int from_tty)
|
||||
+info_auto_load_scripts (char *pattern, int from_tty)
|
||||
{
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
+ struct cleanup *script_chain;
|
||||
+ VEC (loaded_script_ptr) *scripts;
|
||||
+ int nr_scripts;
|
||||
|
||||
dont_repeat ();
|
||||
|
||||
+ pspace_info = get_auto_load_pspace_data (current_program_space);
|
||||
+
|
||||
if (pattern && *pattern)
|
||||
{
|
||||
char *re_err = re_comp (pattern);
|
||||
|
||||
if (re_err)
|
||||
error (_("Invalid regexp: %s"), re_err);
|
||||
-
|
||||
- printf_filtered (_("Objfile scripts matching %s:\n"), pattern);
|
||||
}
|
||||
else
|
||||
{
|
||||
re_comp ("");
|
||||
- printf_filtered (_("Objfile scripts:\n"));
|
||||
}
|
||||
|
||||
- pspace_info = get_auto_load_pspace_data (current_program_space);
|
||||
- if (pspace_info == NULL || pspace_info->loaded_scripts == NULL)
|
||||
- return;
|
||||
+ /* We need to know the number of rows before we build the table.
|
||||
+ Plus we want to sort the scripts by name.
|
||||
+ So first traverse the hash table collecting the matching scripts. */
|
||||
+
|
||||
+ scripts = VEC_alloc (loaded_script_ptr, 10);
|
||||
+ script_chain = make_cleanup (VEC_cleanup (loaded_script_ptr), &scripts);
|
||||
+
|
||||
+ if (pspace_info != NULL && pspace_info->loaded_scripts != NULL)
|
||||
+ {
|
||||
+ immediate_quit++;
|
||||
+ htab_traverse_noresize (pspace_info->loaded_scripts,
|
||||
+ collect_matching_scripts, scripts);
|
||||
+ immediate_quit--;
|
||||
+ }
|
||||
+
|
||||
+ nr_scripts = VEC_length (loaded_script_ptr, scripts);
|
||||
+ make_cleanup_ui_out_table_begin_end (uiout, 2, nr_scripts,
|
||||
+ "AutoLoadedScriptsTable");
|
||||
|
||||
- immediate_quit++;
|
||||
- htab_traverse_noresize (pspace_info->loaded_scripts,
|
||||
- maybe_print_section_script, NULL);
|
||||
- immediate_quit--;
|
||||
+ ui_out_table_header (uiout, 6, ui_center, "loaded", "Loaded");
|
||||
+ ui_out_table_header (uiout, 70, ui_left, "script", "Script");
|
||||
+ ui_out_table_body (uiout);
|
||||
+
|
||||
+ if (nr_scripts > 0)
|
||||
+ {
|
||||
+ int i;
|
||||
+ loaded_script_ptr script;
|
||||
+
|
||||
+ qsort (VEC_address (loaded_script_ptr, scripts),
|
||||
+ VEC_length (loaded_script_ptr, scripts),
|
||||
+ sizeof (loaded_script_ptr), sort_scripts_by_name);
|
||||
+ for (i = 0; VEC_iterate (loaded_script_ptr, scripts, i, script); ++i)
|
||||
+ print_script (script);
|
||||
+ }
|
||||
+
|
||||
+ do_cleanups (script_chain);
|
||||
+
|
||||
+ if (nr_scripts == 0)
|
||||
+ {
|
||||
+ if (pattern && *pattern)
|
||||
+ ui_out_message (uiout, 0, "No auto-load scripts matching %s.\n",
|
||||
+ pattern);
|
||||
+ else
|
||||
+ ui_out_message (uiout, 0, "No auto-load scripts.\n");
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
@@ -486,10 +615,10 @@ an executable or shared library."),
|
||||
&setlist,
|
||||
&showlist);
|
||||
|
||||
- add_cmd ("section-scripts", class_maintenance,
|
||||
- maintenance_print_section_scripts,
|
||||
- _("Print dump of auto-loaded section scripts matching REGEXP."),
|
||||
- &maintenanceprintlist);
|
||||
+ add_info ("auto-load-scripts",
|
||||
+ info_auto_load_scripts,
|
||||
+ _("Print the list of automatically loaded scripts.\n\
|
||||
+Usage: info auto-load-scripts [REGEXP]"));
|
||||
}
|
||||
|
||||
#else /* ! HAVE_PYTHON */
|
||||
Index: gdb-7.3.1/gdb/testsuite/gdb.python/py-objfile-script.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.3.1/gdb/testsuite/gdb.python/py-objfile-script.c 2012-04-20 22:34:03.664955646 +0200
|
||||
@@ -0,0 +1,39 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2011 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/>. */
|
||||
+
|
||||
+struct ss
|
||||
+{
|
||||
+ int a;
|
||||
+ int b;
|
||||
+};
|
||||
+
|
||||
+void
|
||||
+init_ss (struct ss *s, int a, int b)
|
||||
+{
|
||||
+ s->a = a;
|
||||
+ s->b = b;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+ struct ss ss;
|
||||
+
|
||||
+ init_ss (&ss, 1, 2);
|
||||
+
|
||||
+ return 0; /* break to inspect struct and union */
|
||||
+}
|
||||
Index: gdb-7.3.1/gdb/testsuite/gdb.python/py-objfile-script.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.3.1/gdb/testsuite/gdb.python/py-objfile-script.exp 2012-04-20 22:34:03.664955646 +0200
|
||||
@@ -0,0 +1,60 @@
|
||||
+# Copyright (C) 2011 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 file is part of the GDB testsuite. It tests automagic loading of
|
||||
+# -gdb.py scripts.
|
||||
+
|
||||
+if $tracelevel then {
|
||||
+ strace $tracelevel
|
||||
+}
|
||||
+
|
||||
+set testfile "py-objfile-script"
|
||||
+set srcfile ${testfile}.c
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
||||
+ untested "Couldn't compile ${srcfile}"
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+# Start with a fresh gdb.
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+
|
||||
+# Skip all tests if Python scripting is not enabled.
|
||||
+if { [skip_python_tests] } { continue }
|
||||
+
|
||||
+# Make the -gdb.py script available to gdb, it is automagically loaded by gdb.
|
||||
+# Care is taken to put it in the same directory as the binary so that
|
||||
+# gdb will find it.
|
||||
+set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}-gdb.py ${subdir}/${testfile}-gdb.py]
|
||||
+
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+# Verify gdb loaded the script.
|
||||
+gdb_test "info auto-load-scripts" "Yes.*/${testfile}-gdb.py.*"
|
||||
+
|
||||
+if ![runto_main] {
|
||||
+ perror "couldn't run to main"
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
|
||||
+ ".*Breakpoint.*"
|
||||
+gdb_test "continue" ".*Breakpoint.*"
|
||||
+
|
||||
+gdb_test "print ss" " = a=<1> b=<2>"
|
||||
+
|
||||
+remote_file host delete ${remote_python_file}
|
||||
Index: gdb-7.3.1/gdb/testsuite/gdb.python/py-section-script.exp
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/testsuite/gdb.python/py-section-script.exp 2011-03-13 14:39:17.000000000 +0100
|
||||
+++ gdb-7.3.1/gdb/testsuite/gdb.python/py-section-script.exp 2012-04-20 22:34:03.664955646 +0200
|
||||
@@ -55,6 +55,14 @@ set remote_python_file [remote_download
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_load ${binfile}
|
||||
|
||||
+# Verify gdb loaded the script.
|
||||
+gdb_test "info auto-load-scripts" "Yes.*${testfile}.py.*full name: .*/${testfile}.py.*"
|
||||
+# Again, with a regexp this time.
|
||||
+gdb_test "info auto-load-scripts ${testfile}" "Yes.*${testfile}.py.*full name: .*/${testfile}.py.*"
|
||||
+# Again, with a regexp that matches no scripts.
|
||||
+gdb_test "info auto-load-scripts no-script-matches-this" \
|
||||
+ "No auto-load scripts matching no-script-matches-this."
|
||||
+
|
||||
if ![runto_main] {
|
||||
perror "couldn't run to main"
|
||||
return
|
||||
diff --git a/gdb/testsuite/gdb.python/py-objfile-script-gdb.py b/gdb/testsuite/gdb.python/py-objfile-script-gdb.py
|
||||
new file mode 100644
|
||||
index 0000000..c54e9ec
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.python/py-objfile-script-gdb.py
|
||||
@@ -0,0 +1,63 @@
|
||||
+# Copyright (C) 2011 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 file is part of the GDB testsuite.
|
||||
+
|
||||
+import re
|
||||
+
|
||||
+class pp_ss:
|
||||
+ def __init__(self, val):
|
||||
+ self.val = val
|
||||
+
|
||||
+ def to_string(self):
|
||||
+ return "a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">"
|
||||
+
|
||||
+def lookup_function (val):
|
||||
+ "Look-up and return a pretty-printer that can print val."
|
||||
+
|
||||
+ # Get the type.
|
||||
+ type = val.type
|
||||
+
|
||||
+ # If it points to a reference, get the reference.
|
||||
+ if type.code == gdb.TYPE_CODE_REF:
|
||||
+ type = type.target ()
|
||||
+
|
||||
+ # Get the unqualified type, stripped of typedefs.
|
||||
+ type = type.unqualified ().strip_typedefs ()
|
||||
+
|
||||
+ # Get the type name.
|
||||
+ typename = type.tag
|
||||
+
|
||||
+ if typename == None:
|
||||
+ return None
|
||||
+
|
||||
+ # Iterate over local dictionary of types to determine
|
||||
+ # if a printer is registered for that type. Return an
|
||||
+ # instantiation of the printer if found.
|
||||
+ for function in pretty_printers_dict:
|
||||
+ if function.match (typename):
|
||||
+ return pretty_printers_dict[function] (val)
|
||||
+
|
||||
+ # Cannot find a pretty printer. Return None.
|
||||
+
|
||||
+ return None
|
||||
+
|
||||
+def register_pretty_printers ():
|
||||
+ pretty_printers_dict[re.compile ('^ss$')] = pp_ss
|
||||
+
|
||||
+pretty_printers_dict = {}
|
||||
+
|
||||
+register_pretty_printers ()
|
||||
+gdb.current_progspace().pretty_printers.append (lookup_function)
|
|
@ -0,0 +1,76 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-05/msg00112.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/05/14 05:44:37 1.13009
|
||||
### src/gdb/ChangeLog 2011/05/15 18:46:23 1.13010
|
||||
## -1,3 +1,9 @@
|
||||
+2011-05-15 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * python/py-autoload.c (print_script): Print "Missing" instead of
|
||||
+ "No" for missing scripts.
|
||||
+ (info_auto_load_scripts): Tweak "Loaded" column to fit "Missing".
|
||||
+
|
||||
2011-05-13 Doug Evans <dje@google.com>
|
||||
|
||||
* ui-file.c (stdio_file_write_async_safe): Add comment.
|
||||
--- src/gdb/python/py-auto-load.c 2011/05/13 22:11:47 1.9
|
||||
+++ src/gdb/python/py-auto-load.c 2011/05/15 18:46:24 1.10
|
||||
@@ -497,7 +497,7 @@
|
||||
|
||||
chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
|
||||
|
||||
- ui_out_field_string (uiout, "loaded", script->full_path ? "Yes" : "No");
|
||||
+ ui_out_field_string (uiout, "loaded", script->full_path ? "Yes" : "Missing");
|
||||
ui_out_field_string (uiout, "script", script->name);
|
||||
ui_out_text (uiout, "\n");
|
||||
|
||||
@@ -569,7 +569,7 @@
|
||||
make_cleanup_ui_out_table_begin_end (uiout, 2, nr_scripts,
|
||||
"AutoLoadedScriptsTable");
|
||||
|
||||
- ui_out_table_header (uiout, 6, ui_center, "loaded", "Loaded");
|
||||
+ ui_out_table_header (uiout, 7, ui_left, "loaded", "Loaded");
|
||||
ui_out_table_header (uiout, 70, ui_left, "script", "Script");
|
||||
ui_out_table_body (uiout);
|
||||
|
||||
### src/gdb/doc/ChangeLog 2011/05/13 22:36:07 1.1190
|
||||
### src/gdb/doc/ChangeLog 2011/05/15 18:46:25 1.1191
|
||||
## -1,3 +1,7 @@
|
||||
+2011-05-15 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * gdb.texinfo (Auto-loading): Document printing of missing scripts.
|
||||
+
|
||||
2011-05-13 Doug Evans <dje@google.com>
|
||||
|
||||
* gdb.texinfo (Threads): Document $sdir,$pdir.
|
||||
--- src/gdb/doc/gdb.texinfo 2011/05/13 22:36:07 1.838
|
||||
+++ src/gdb/doc/gdb.texinfo 2011/05/15 18:46:25 1.839
|
||||
@@ -23601,14 +23601,25 @@
|
||||
@kindex info auto-load-scripts
|
||||
@cindex print list of auto-loaded scripts
|
||||
@item info auto-load-scripts [@var{regexp}]
|
||||
-Print the list of all scripts that gdb auto-loaded, or tried to auto-load.
|
||||
+Print the list of all scripts that @value{GDBN} auto-loaded.
|
||||
+
|
||||
+Also printed is the list of scripts that were mentioned in
|
||||
+the @code{.debug_gdb_scripts} section and were not found
|
||||
+(@pxref{.debug_gdb_scripts section}).
|
||||
+This is useful because their names are not printed when @value{GDBN}
|
||||
+tries to load them and fails. There may be many of them, and printing
|
||||
+an error message for each one is problematic.
|
||||
+
|
||||
If @var{regexp} is supplied only scripts with matching names are printed.
|
||||
|
||||
+Example:
|
||||
+
|
||||
@smallexample
|
||||
(gdb) info auto-load-scripts
|
||||
-Loaded Script
|
||||
- Yes py-section-script.py
|
||||
- full name: /tmp/py-section-script.py
|
||||
+Loaded Script
|
||||
+Yes py-section-script.py
|
||||
+ full name: /tmp/py-section-script.py
|
||||
+Missing my-foo-pretty-printers.py
|
||||
@end smallexample
|
||||
@end table
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-05/msg00119.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/05/16 02:22:34 1.13011
|
||||
### src/gdb/ChangeLog 2011/05/16 16:33:49 1.13012
|
||||
## -1,3 +1,8 @@
|
||||
+2011-05-16 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * python/py-auto-load.c (source_section_scripts): Mention objfile
|
||||
+ name in warning.
|
||||
+
|
||||
2011-05-15 Doug Evans <dje@google.com>
|
||||
|
||||
* linux-thread-db.c (try_thread_db_load_from_pdir_1): New function.
|
||||
--- src/gdb/python/py-auto-load.c 2011/05/15 18:46:24 1.10
|
||||
+++ src/gdb/python/py-auto-load.c 2011/05/16 16:33:57 1.11
|
||||
@@ -304,9 +304,10 @@
|
||||
/* We don't throw an error, the program is still debuggable. */
|
||||
if (! pspace_info->script_not_found_warning_printed)
|
||||
{
|
||||
- warning (_("Missing auto-load scripts referenced in %s.\n\
|
||||
+ warning (_("Missing auto-load scripts referenced in section %s\n\
|
||||
+of file %s\n\
|
||||
Use `info auto-load-scripts [REGEXP]' to list them."),
|
||||
- GDBPY_AUTO_SECTION_NAME);
|
||||
+ GDBPY_AUTO_SECTION_NAME, objfile->name);
|
||||
pspace_info->script_not_found_warning_printed = TRUE;
|
||||
}
|
||||
continue;
|
|
@ -0,0 +1,70 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-09/msg00121.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/09/19 10:50:53 1.13352
|
||||
### src/gdb/ChangeLog 2011/09/19 19:01:38 1.13353
|
||||
## -1,3 +1,9 @@
|
||||
+2011-09-19 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * python/py-auto-load.c (source_section_scripts): Fix file
|
||||
+ descriptor leak.
|
||||
+ * python/python.c (source_python_script_for_objfile): Tweak comments.
|
||||
+
|
||||
2011-09-18 Yao Qi <yao@codesourcery.com>
|
||||
Ulrich Weigand <ulrich.weigand@linaro.org>
|
||||
|
||||
--- src/gdb/python/python.c 2011/09/15 12:42:30 1.72
|
||||
+++ src/gdb/python/python.c 2011/09/19 19:01:40 1.73
|
||||
@@ -903,7 +903,10 @@
|
||||
static struct objfile *gdbpy_current_objfile;
|
||||
|
||||
/* Set the current objfile to OBJFILE and then read STREAM,FILE as
|
||||
- Python code. */
|
||||
+ Python code.
|
||||
+ STREAM is left open, it is up to the caller to close it.
|
||||
+ If an exception occurs python will print the traceback and
|
||||
+ clear the error indicator. */
|
||||
|
||||
void
|
||||
source_python_script_for_objfile (struct objfile *objfile,
|
||||
@@ -914,8 +917,6 @@
|
||||
cleanups = ensure_python_env (get_objfile_arch (objfile), current_language);
|
||||
gdbpy_current_objfile = objfile;
|
||||
|
||||
- /* Note: If an exception occurs python will print the traceback and
|
||||
- clear the error indicator. */
|
||||
PyRun_SimpleFile (stream, file);
|
||||
|
||||
do_cleanups (cleanups);
|
||||
--- src/gdb/python/py-auto-load.c 2011/08/04 19:10:14 1.12
|
||||
+++ src/gdb/python/py-auto-load.c 2011/09/19 19:01:40 1.13
|
||||
@@ -296,9 +296,6 @@
|
||||
in_hash_table = maybe_add_script (pspace_info->loaded_scripts, file,
|
||||
opened ? full_path : NULL);
|
||||
|
||||
- if (opened)
|
||||
- free (full_path);
|
||||
-
|
||||
if (! opened)
|
||||
{
|
||||
/* We don't throw an error, the program is still debuggable. */
|
||||
@@ -310,12 +307,15 @@
|
||||
GDBPY_AUTO_SECTION_NAME, objfile->name);
|
||||
pspace_info->script_not_found_warning_printed = TRUE;
|
||||
}
|
||||
- continue;
|
||||
}
|
||||
-
|
||||
- /* If this file is not currently loaded, load it. */
|
||||
- if (! in_hash_table)
|
||||
- source_python_script_for_objfile (objfile, stream, file);
|
||||
+ else
|
||||
+ {
|
||||
+ /* If this file is not currently loaded, load it. */
|
||||
+ if (! in_hash_table)
|
||||
+ source_python_script_for_objfile (objfile, stream, file);
|
||||
+ fclose (stream);
|
||||
+ free (full_path);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-10/msg00012.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/10/03 16:14:39 1.13370
|
||||
### src/gdb/ChangeLog 2011/10/03 20:46:18 1.13371
|
||||
## -1,3 +1,10 @@
|
||||
+2011-10-03 Joel Brobecker <brobecker@adacore.com>
|
||||
+
|
||||
+ * python/python.c (python_run_simple_file): New function.
|
||||
+ (source_python_script, source_python_script_for_objfile):
|
||||
+ Replace call to PyRun_SimpleFile by call to
|
||||
+ python_run_simple_file.
|
||||
+
|
||||
2011-10-03 Paul Koning <paul_koning@dell.com>
|
||||
|
||||
* python/py-value.c (valpy_get_address): Use Py_XINCREF.
|
||||
--- src/gdb/python/python.c 2011/09/19 19:01:40 1.73
|
||||
+++ src/gdb/python/python.c 2011/10/03 20:46:19 1.74
|
||||
@@ -134,6 +134,45 @@
|
||||
return make_cleanup (restore_python_env, env);
|
||||
}
|
||||
|
||||
+/* A wrapper around PyRun_SimpleFile. FILENAME is the name of
|
||||
+ the Python script to run.
|
||||
+
|
||||
+ One of the parameters of PyRun_SimpleFile is a FILE *.
|
||||
+ The problem is that type FILE is extremely system and compiler
|
||||
+ dependent. So, unless the Python library has been compiled using
|
||||
+ the same build environment as GDB, we run the risk of getting
|
||||
+ a crash due to inconsistencies between the definition used by GDB,
|
||||
+ and the definition used by Python. A mismatch can very likely
|
||||
+ lead to a crash.
|
||||
+
|
||||
+ There is also the situation where the Python library and GDB
|
||||
+ are using two different versions of the C runtime library.
|
||||
+ This is particularly visible on Windows, where few users would
|
||||
+ build Python themselves (this is no trivial task on this platform),
|
||||
+ and thus use binaries built by someone else instead. Python,
|
||||
+ being built with VC, would use one version of the msvcr DLL
|
||||
+ (Eg. msvcr100.dll), while MinGW uses msvcrt.dll. A FILE *
|
||||
+ from one runtime does not necessarily operate correctly in
|
||||
+ the other runtime.
|
||||
+
|
||||
+ To work around this potential issue, we create the FILE object
|
||||
+ using Python routines, thus making sure that it is compatible
|
||||
+ with the Python library. */
|
||||
+
|
||||
+static void
|
||||
+python_run_simple_file (const char *filename)
|
||||
+{
|
||||
+ char *filename_copy;
|
||||
+ PyObject *python_file;
|
||||
+ struct cleanup *cleanup;
|
||||
+
|
||||
+ filename_copy = xstrdup (filename);
|
||||
+ cleanup = make_cleanup (xfree, filename_copy);
|
||||
+ python_file = PyFile_FromString (filename_copy, "r");
|
||||
+ make_cleanup_py_decref (python_file);
|
||||
+ PyRun_SimpleFile (PyFile_AsFile (python_file), filename);
|
||||
+ do_cleanups (cleanup);
|
||||
+}
|
||||
|
||||
/* Given a command_line, return a command string suitable for passing
|
||||
to Python. Lines in the string are separated by newlines. The
|
||||
@@ -573,7 +612,7 @@
|
||||
|
||||
/* Note: If an exception occurs python will print the traceback and
|
||||
clear the error indicator. */
|
||||
- PyRun_SimpleFile (stream, file);
|
||||
+ python_run_simple_file (file);
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
@@ -917,7 +956,7 @@
|
||||
cleanups = ensure_python_env (get_objfile_arch (objfile), current_language);
|
||||
gdbpy_current_objfile = objfile;
|
||||
|
||||
- PyRun_SimpleFile (stream, file);
|
||||
+ python_run_simple_file (file);
|
||||
|
||||
do_cleanups (cleanups);
|
||||
gdbpy_current_objfile = NULL;
|
|
@ -0,0 +1,179 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-10/msg00197.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/10/27 15:32:10 1.13467
|
||||
### src/gdb/ChangeLog 2011/10/27 15:46:07 1.13468
|
||||
## -1,3 +1,15 @@
|
||||
+2011-10-27 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * cli/cli-cmds.c (source_script_with_search): Pass full path to
|
||||
+ source_script_from_stream if it may have been found on the search path.
|
||||
+ * python/py-auto-load.c (source_section_scripts): Pass full path to
|
||||
+ source_python_script_for_objfile.
|
||||
+ * python/python.c (source_python_script): Delete stream parameter.
|
||||
+ All callers updated.
|
||||
+ (source_python_script_for_objfile): Ditto.
|
||||
+ * python/python-internal.h (source_python_script_for_objfile): Update.
|
||||
+ * python/python.h (source_python_script): Update.
|
||||
+
|
||||
2011-10-27 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* ada-lang.h (ada_start_decode_line_1, ada_finish_decode_line_1)
|
||||
Index: gdb-7.3.50.20110722/gdb/cli/cli-cmds.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/cli/cli-cmds.c 2011-06-07 19:26:46.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/cli/cli-cmds.c 2012-04-18 23:38:50.808994431 +0200
|
||||
@@ -534,7 +534,9 @@ source_script_from_stream (FILE *stream,
|
||||
|
||||
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||
{
|
||||
- source_python_script (stream, file);
|
||||
+ /* The python support reopens the file using python functions,
|
||||
+ so there's no point in passing STREAM here. */
|
||||
+ source_python_script (file);
|
||||
}
|
||||
if (e.reason < 0)
|
||||
{
|
||||
@@ -576,7 +578,7 @@ source_script_with_search (const char *f
|
||||
|
||||
if (!find_and_open_script (file, search_path, &stream, &full_path))
|
||||
{
|
||||
- /* The script wasn't found, or was otherwise inaccessible.
|
||||
+ /* The script wasn't found, or was otherwise inaccessible.
|
||||
If the source command was invoked interactively, throw an
|
||||
error. Otherwise (e.g. if it was invoked by a script),
|
||||
silently ignore the error. */
|
||||
@@ -587,7 +589,12 @@ source_script_with_search (const char *f
|
||||
}
|
||||
|
||||
old_cleanups = make_cleanup (xfree, full_path);
|
||||
- source_script_from_stream (stream, file);
|
||||
+ /* The python support reopens the file, so we need to pass full_path here
|
||||
+ in case the file was found on the search path. It's useful to do this
|
||||
+ anyway so that error messages show the actual file used. But only do
|
||||
+ this if we (may have) used search_path, as printing the full path in
|
||||
+ errors for the non-search case can be more noise than signal. */
|
||||
+ source_script_from_stream (stream, search_path ? full_path : file);
|
||||
do_cleanups (old_cleanups);
|
||||
}
|
||||
|
||||
Index: gdb-7.3.50.20110722/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/py-auto-load.c 2012-04-18 23:38:42.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/py-auto-load.c 2012-04-18 23:38:50.809994429 +0200
|
||||
@@ -312,7 +312,7 @@ Use `info auto-load-scripts [REGEXP]' to
|
||||
{
|
||||
/* If this file is not currently loaded, load it. */
|
||||
if (! in_hash_table)
|
||||
- source_python_script_for_objfile (objfile, stream, file);
|
||||
+ source_python_script_for_objfile (objfile, full_path);
|
||||
fclose (stream);
|
||||
free (full_path);
|
||||
}
|
||||
@@ -431,7 +431,7 @@ auto_load_objfile_script (struct objfile
|
||||
It's highly unlikely that we'd ever load it twice,
|
||||
and these scripts are required to be idempotent under multiple
|
||||
loads anyway. */
|
||||
- source_python_script_for_objfile (objfile, input, debugfile);
|
||||
+ source_python_script_for_objfile (objfile, debugfile);
|
||||
fclose (input);
|
||||
}
|
||||
|
||||
Index: gdb-7.3.50.20110722/gdb/python/python.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/python.c 2012-04-18 23:38:42.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/python.c 2012-04-18 23:38:50.809994429 +0200
|
||||
@@ -594,21 +594,18 @@ gdbpy_parse_and_eval (PyObject *self, Py
|
||||
return value_to_value_object (result);
|
||||
}
|
||||
|
||||
-/* Read a file as Python code. STREAM is the input file; FILE is the
|
||||
- name of the file.
|
||||
- STREAM is not closed, that is the caller's responsibility. */
|
||||
+/* Read a file as Python code.
|
||||
+ FILE is the name of the file.
|
||||
+ This does not throw any errors. If an exception occurs python will print
|
||||
+ the traceback and clear the error indicator. */
|
||||
|
||||
void
|
||||
-source_python_script (FILE *stream, const char *file)
|
||||
+source_python_script (const char *file)
|
||||
{
|
||||
struct cleanup *cleanup;
|
||||
|
||||
cleanup = ensure_python_env (get_current_arch (), current_language);
|
||||
-
|
||||
- /* Note: If an exception occurs python will print the traceback and
|
||||
- clear the error indicator. */
|
||||
python_run_simple_file (file);
|
||||
-
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
@@ -983,15 +980,12 @@ gdbpy_progspaces (PyObject *unused1, PyO
|
||||
source_python_script_for_objfile; it is NULL at other times. */
|
||||
static struct objfile *gdbpy_current_objfile;
|
||||
|
||||
-/* Set the current objfile to OBJFILE and then read STREAM,FILE as
|
||||
- Python code.
|
||||
- STREAM is left open, it is up to the caller to close it.
|
||||
- If an exception occurs python will print the traceback and
|
||||
- clear the error indicator. */
|
||||
+/* Set the current objfile to OBJFILE and then read FILE as Python code.
|
||||
+ This does not throw any errors. If an exception occurs python will print
|
||||
+ the traceback and clear the error indicator. */
|
||||
|
||||
void
|
||||
-source_python_script_for_objfile (struct objfile *objfile,
|
||||
- FILE *stream, const char *file)
|
||||
+source_python_script_for_objfile (struct objfile *objfile, const char *file)
|
||||
{
|
||||
struct cleanup *cleanups;
|
||||
|
||||
@@ -1074,7 +1068,7 @@ eval_python_from_control_command (struct
|
||||
}
|
||||
|
||||
void
|
||||
-source_python_script (FILE *stream, const char *file)
|
||||
+source_python_script (const char *file)
|
||||
{
|
||||
throw_error (UNSUPPORTED_ERROR,
|
||||
_("Python scripting is not supported in this copy of GDB."));
|
||||
Index: gdb-7.3.50.20110722/gdb/python/python.h
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/python.h 2012-04-18 23:38:41.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/python.h 2012-04-18 23:38:50.809994429 +0200
|
||||
@@ -30,7 +30,7 @@ extern void finish_python_initialization
|
||||
|
||||
void eval_python_from_control_command (struct command_line *);
|
||||
|
||||
-void source_python_script (FILE *stream, const char *file);
|
||||
+void source_python_script (const char *file);
|
||||
|
||||
void run_python_script (int argc, char **argv);
|
||||
|
||||
Index: gdb-7.3.50.20110722/gdb/python/python-internal.h
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/python-internal.h 2011-06-28 15:09:12.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/python-internal.h 2012-04-18 23:38:50.809994429 +0200
|
||||
@@ -242,7 +242,7 @@ extern const struct language_defn *pytho
|
||||
void gdbpy_print_stack (void);
|
||||
|
||||
void source_python_script_for_objfile (struct objfile *objfile,
|
||||
- FILE *stream, const char *file);
|
||||
+ const char *file);
|
||||
|
||||
PyObject *python_string_to_unicode (PyObject *obj);
|
||||
char *unicode_to_target_string (PyObject *unicode_str);
|
||||
Index: gdb-7.3.50.20110722/gdb/testsuite/gdb.python/python.exp
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/testsuite/gdb.python/python.exp 2011-07-21 13:03:48.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/testsuite/gdb.python/python.exp 2012-04-18 23:38:50.810994427 +0200
|
||||
@@ -75,6 +75,8 @@ gdb_py_test_multiple "indented multi-lin
|
||||
|
||||
gdb_test "source $srcdir/$subdir/source2.py" "yes"
|
||||
|
||||
+gdb_test "source -s source2.py" "yes" "source -s source2.py"
|
||||
+
|
||||
gdb_test "python print gdb.current_objfile()" "None"
|
||||
gdb_test "python print gdb.objfiles()" "\\\[\\\]"
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2011-12/msg00201.html
|
||||
|
||||
### src/gdb/ChangeLog 2011/12/19 22:20:05 1.13649
|
||||
### src/gdb/ChangeLog 2011/12/20 04:29:33 1.13650
|
||||
## -1,3 +1,9 @@
|
||||
+2011-12-19 Doug Evans <dje@google.com>
|
||||
+
|
||||
+ * python/py-auto-load.c (info_auto_load_scripts): Pass address of
|
||||
+ scripts vector to collect_matching_scripts.
|
||||
+ (collect_matching_scripts): Update.
|
||||
+
|
||||
2011-12-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* symfile.c (reread_symbols): Move free_objfile_separate_debug,
|
||||
--- src/gdb/python/py-auto-load.c 2011/12/10 22:51:47 1.15
|
||||
+++ src/gdb/python/py-auto-load.c 2011/12/20 04:29:35 1.16
|
||||
@@ -481,10 +481,10 @@
|
||||
collect_matching_scripts (void **slot, void *info)
|
||||
{
|
||||
struct loaded_script *script = *slot;
|
||||
- VEC (loaded_script_ptr) *scripts = info;
|
||||
+ VEC (loaded_script_ptr) **scripts_ptr = info;
|
||||
|
||||
if (re_exec (script->name))
|
||||
- VEC_safe_push (loaded_script_ptr, scripts, script);
|
||||
+ VEC_safe_push (loaded_script_ptr, *scripts_ptr, script);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -563,8 +563,9 @@
|
||||
if (pspace_info != NULL && pspace_info->loaded_scripts != NULL)
|
||||
{
|
||||
immediate_quit++;
|
||||
+ /* Pass a pointer to scripts as VEC_safe_push can realloc space. */
|
||||
htab_traverse_noresize (pspace_info->loaded_scripts,
|
||||
- collect_matching_scripts, scripts);
|
||||
+ collect_matching_scripts, &scripts);
|
||||
immediate_quit--;
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-01/msg00202.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/01/24 19:12:31 1.13771
|
||||
### src/gdb/ChangeLog 2012/01/24 20:56:33 1.13772
|
||||
## -1,3 +1,12 @@
|
||||
+2012-01-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ Code cleanup.
|
||||
+ * cli/cli-cmds.c (source_script_from_stream): Never fclose STREAM.
|
||||
+ Update the function comment for it.
|
||||
+ (source_script_with_search): Call make_cleanup_fclose for STREAM.
|
||||
+ * cli/cli-script.c (script_from_file): Do not call make_cleanup_fclose
|
||||
+ for STREAM.
|
||||
+
|
||||
2012-01-24 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* breakpoint.c (bpstat_stop_status): Moving clearing print_it
|
||||
Index: gdb-7.3.50.20110722/gdb/cli/cli-cmds.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/cli/cli-cmds.c 2012-04-18 23:38:50.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/cli/cli-cmds.c 2012-04-18 23:39:52.709847704 +0200
|
||||
@@ -521,8 +521,7 @@ find_and_open_script (const char *script
|
||||
return 1;
|
||||
}
|
||||
|
||||
-/* Load script FILE, which has already been opened as STREAM.
|
||||
- STREAM is closed before we return. */
|
||||
+/* Load script FILE, which has already been opened as STREAM. */
|
||||
|
||||
static void
|
||||
source_script_from_stream (FILE *stream, const char *file)
|
||||
@@ -550,12 +549,9 @@ source_script_from_stream (FILE *stream,
|
||||
else
|
||||
{
|
||||
/* Nope, just punt. */
|
||||
- fclose (stream);
|
||||
throw_exception (e);
|
||||
}
|
||||
}
|
||||
- else
|
||||
- fclose (stream);
|
||||
}
|
||||
else
|
||||
script_from_file (stream, file);
|
||||
@@ -589,6 +585,7 @@ source_script_with_search (const char *f
|
||||
}
|
||||
|
||||
old_cleanups = make_cleanup (xfree, full_path);
|
||||
+ make_cleanup_fclose (stream);
|
||||
/* The python support reopens the file, so we need to pass full_path here
|
||||
in case the file was found on the search path. It's useful to do this
|
||||
anyway so that error messages show the actual file used. But only do
|
||||
Index: gdb-7.3.50.20110722/gdb/cli/cli-script.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/cli/cli-script.c 2011-06-27 21:21:50.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/cli/cli-script.c 2012-04-18 23:39:22.845918492 +0200
|
||||
@@ -1600,11 +1600,9 @@ script_from_file (FILE *stream, const ch
|
||||
if (stream == NULL)
|
||||
internal_error (__FILE__, __LINE__, _("called with NULL file pointer!"));
|
||||
|
||||
- old_cleanups = make_cleanup_fclose (stream);
|
||||
-
|
||||
old_lines.old_line = source_line_number;
|
||||
old_lines.old_file = source_file_name;
|
||||
- make_cleanup (source_cleanup_lines, &old_lines);
|
||||
+ old_cleanups = make_cleanup (source_cleanup_lines, &old_lines);
|
||||
source_line_number = 0;
|
||||
source_file_name = file;
|
||||
/* This will get set every time we read a line. So it won't stay ""
|
|
@ -0,0 +1,103 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-01/msg00205.html
|
||||
|
||||
--- src/gdb/gdb_vecs.h
|
||||
+++ src/gdb/gdb_vecs.h 2012-04-17 22:04:23.818666000 +0000
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* Some commonly-used VEC types.
|
||||
+
|
||||
+ Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
+
|
||||
+ This file is part of GDB.
|
||||
+
|
||||
+ 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/>. */
|
||||
+
|
||||
+
|
||||
+#ifndef GDB_VECS_H
|
||||
+#define GDB_VECS_H
|
||||
+
|
||||
+#include "vec.h"
|
||||
+
|
||||
+DEF_VEC_P (char_ptr);
|
||||
+
|
||||
+#endif /* GDB_VECS_H */
|
||||
### src/gdb/ChangeLog 2012/01/24 21:32:56 1.13774
|
||||
### src/gdb/ChangeLog 2012/01/24 21:36:37 1.13775
|
||||
## -1,3 +1,10 @@
|
||||
+2012-01-24 Tom Tromey <tromey@redhat.com>
|
||||
+
|
||||
+ * ada-lang.c: Include gdb_vecs.h.
|
||||
+ * charset.c: Include gdb_vecs.h.
|
||||
+ * tracepoint.h: Include gdb_vecs.h.
|
||||
+ * gdb_vecs.h: New file.
|
||||
+
|
||||
2012-01-24 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* breakpoint.c (breakpoint_hit_catch_fork)
|
||||
--- src/gdb/ada-lang.c 2012/01/06 03:34:45 1.330
|
||||
+++ src/gdb/ada-lang.c 2012/01/24 21:36:37 1.331
|
||||
@@ -57,6 +57,7 @@
|
||||
#include "observer.h"
|
||||
#include "vec.h"
|
||||
#include "stack.h"
|
||||
+#include "gdb_vecs.h"
|
||||
|
||||
#include "psymtab.h"
|
||||
#include "value.h"
|
||||
@@ -5628,8 +5629,6 @@
|
||||
return sym_name;
|
||||
}
|
||||
|
||||
-DEF_VEC_P (char_ptr);
|
||||
-
|
||||
/* A companion function to ada_make_symbol_completion_list().
|
||||
Check if SYM_NAME represents a symbol which name would be suitable
|
||||
to complete TEXT (TEXT_LEN is the length of TEXT), in which case
|
||||
--- src/gdb/charset.c 2012/01/04 08:17:00 1.46
|
||||
+++ src/gdb/charset.c 2012/01/24 21:36:37 1.47
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "vec.h"
|
||||
#include "environ.h"
|
||||
#include "arch-utils.h"
|
||||
+#include "gdb_vecs.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include "gdb_string.h"
|
||||
@@ -717,8 +718,6 @@
|
||||
|
||||
extern initialize_file_ftype _initialize_charset; /* -Wmissing-prototype */
|
||||
|
||||
-DEF_VEC_P (char_ptr);
|
||||
-
|
||||
static VEC (char_ptr) *charsets;
|
||||
|
||||
#ifdef PHONY_ICONV
|
||||
--- src/gdb/tracepoint.h 2012/01/04 08:27:57 1.46
|
||||
+++ src/gdb/tracepoint.h 2012/01/24 21:36:37 1.47
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "breakpoint.h"
|
||||
#include "target.h"
|
||||
#include "memrange.h"
|
||||
+#include "gdb_vecs.h"
|
||||
|
||||
/* A trace state variable is a value managed by a target being
|
||||
traced. A trace state variable (or tsv for short) can be accessed
|
||||
@@ -143,8 +144,6 @@
|
||||
|
||||
/* Struct to collect random info about tracepoints on the target. */
|
||||
|
||||
-DEF_VEC_P (char_ptr);
|
||||
-
|
||||
struct uploaded_tp
|
||||
{
|
||||
int number;
|
|
@ -0,0 +1,216 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-01/msg00219.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/01/26 16:44:29 1.13780
|
||||
### src/gdb/ChangeLog 2012/01/26 21:54:42 1.13781
|
||||
## -1,3 +1,22 @@
|
||||
+2012-01-26 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ Do not open script filenames twice.
|
||||
+ * cli/cli-cmds.c (source_script_from_stream): Pass to
|
||||
+ source_python_script also STREAM.
|
||||
+ * python/py-auto-load.c (source_section_scripts): Pass to
|
||||
+ source_python_script_for_objfile also STREAM.
|
||||
+ (auto_load_objfile_script): Pass to source_python_script_for_objfile
|
||||
+ also INPUT.
|
||||
+ * python/python-internal.h (source_python_script_for_objfile): New
|
||||
+ parameter file, rename parameter file to filename.
|
||||
+ * python/python.c (python_run_simple_file): Call PyRun_SimpleFile
|
||||
+ instead if !_WIN32. Update the function comment.
|
||||
+ (source_python_script, source_python_script_for_objfile)
|
||||
+ (source_python_script): New parameter file, rename parameter file to
|
||||
+ filename. Pass FILENAME to python_run_simple_file.
|
||||
+ * python/python.h (source_python_script): New parameter file, rename
|
||||
+ parameter file to filename.
|
||||
+
|
||||
2012-01-26 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* corelow.c (core_has_fake_pid): Delete.
|
||||
Index: gdb-7.3.50.20110722/gdb/cli/cli-cmds.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/cli/cli-cmds.c 2012-04-18 23:39:52.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/cli/cli-cmds.c 2012-04-18 23:40:19.179784960 +0200
|
||||
@@ -533,9 +533,7 @@ source_script_from_stream (FILE *stream,
|
||||
|
||||
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||
{
|
||||
- /* The python support reopens the file using python functions,
|
||||
- so there's no point in passing STREAM here. */
|
||||
- source_python_script (file);
|
||||
+ source_python_script (stream, file);
|
||||
}
|
||||
if (e.reason < 0)
|
||||
{
|
||||
Index: gdb-7.3.50.20110722/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/py-auto-load.c 2012-04-18 23:38:50.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/py-auto-load.c 2012-04-18 23:40:45.197723289 +0200
|
||||
@@ -312,7 +312,7 @@ Use `info auto-load-scripts [REGEXP]' to
|
||||
{
|
||||
/* If this file is not currently loaded, load it. */
|
||||
if (! in_hash_table)
|
||||
- source_python_script_for_objfile (objfile, full_path);
|
||||
+ source_python_script_for_objfile (objfile, stream, full_path);
|
||||
fclose (stream);
|
||||
free (full_path);
|
||||
}
|
||||
@@ -431,7 +431,7 @@ auto_load_objfile_script (struct objfile
|
||||
It's highly unlikely that we'd ever load it twice,
|
||||
and these scripts are required to be idempotent under multiple
|
||||
loads anyway. */
|
||||
- source_python_script_for_objfile (objfile, debugfile);
|
||||
+ source_python_script_for_objfile (objfile, input, debugfile);
|
||||
fclose (input);
|
||||
}
|
||||
|
||||
Index: gdb-7.3.50.20110722/gdb/python/python-internal.h
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/python-internal.h 2012-04-18 23:38:50.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/python-internal.h 2012-04-18 23:40:19.180784958 +0200
|
||||
@@ -241,8 +241,8 @@ extern const struct language_defn *pytho
|
||||
|
||||
void gdbpy_print_stack (void);
|
||||
|
||||
-void source_python_script_for_objfile (struct objfile *objfile,
|
||||
- const char *file);
|
||||
+void source_python_script_for_objfile (struct objfile *objfile, FILE *file,
|
||||
+ const char *filename);
|
||||
|
||||
PyObject *python_string_to_unicode (PyObject *obj);
|
||||
char *unicode_to_target_string (PyObject *unicode_str);
|
||||
Index: gdb-7.3.50.20110722/gdb/python/python.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/python.c 2012-04-18 23:38:50.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/python.c 2012-04-18 23:42:01.188543162 +0200
|
||||
@@ -136,34 +136,31 @@ ensure_python_env (struct gdbarch *gdbar
|
||||
return make_cleanup (restore_python_env, env);
|
||||
}
|
||||
|
||||
-/* A wrapper around PyRun_SimpleFile. FILENAME is the name of
|
||||
- the Python script to run.
|
||||
+/* A wrapper around PyRun_SimpleFile. FILE is the Python script to run
|
||||
+ named FILENAME.
|
||||
|
||||
- One of the parameters of PyRun_SimpleFile is a FILE *.
|
||||
- The problem is that type FILE is extremely system and compiler
|
||||
- dependent. So, unless the Python library has been compiled using
|
||||
- the same build environment as GDB, we run the risk of getting
|
||||
- a crash due to inconsistencies between the definition used by GDB,
|
||||
- and the definition used by Python. A mismatch can very likely
|
||||
- lead to a crash.
|
||||
-
|
||||
- There is also the situation where the Python library and GDB
|
||||
- are using two different versions of the C runtime library.
|
||||
- This is particularly visible on Windows, where few users would
|
||||
- build Python themselves (this is no trivial task on this platform),
|
||||
- and thus use binaries built by someone else instead. Python,
|
||||
- being built with VC, would use one version of the msvcr DLL
|
||||
- (Eg. msvcr100.dll), while MinGW uses msvcrt.dll. A FILE *
|
||||
- from one runtime does not necessarily operate correctly in
|
||||
+ On Windows hosts few users would build Python themselves (this is no
|
||||
+ trivial task on this platform), and thus use binaries built by
|
||||
+ someone else instead. There may happen situation where the Python
|
||||
+ library and GDB are using two different versions of the C runtime
|
||||
+ library. Python, being built with VC, would use one version of the
|
||||
+ msvcr DLL (Eg. msvcr100.dll), while MinGW uses msvcrt.dll.
|
||||
+ A FILE * from one runtime does not necessarily operate correctly in
|
||||
the other runtime.
|
||||
|
||||
- To work around this potential issue, we create the FILE object
|
||||
- using Python routines, thus making sure that it is compatible
|
||||
- with the Python library. */
|
||||
-
|
||||
+ To work around this potential issue, we create on Windows hosts the
|
||||
+ FILE object using Python routines, thus making sure that it is
|
||||
+ compatible with the Python library. */
|
||||
+
|
||||
static void
|
||||
-python_run_simple_file (const char *filename)
|
||||
+python_run_simple_file (FILE *file, const char *filename)
|
||||
{
|
||||
+#ifndef _WIN32
|
||||
+
|
||||
+ PyRun_SimpleFile (file, filename);
|
||||
+
|
||||
+#else /* _WIN32 */
|
||||
+
|
||||
char *filename_copy;
|
||||
PyObject *python_file;
|
||||
struct cleanup *cleanup;
|
||||
@@ -174,6 +171,8 @@ python_run_simple_file (const char *file
|
||||
make_cleanup_py_decref (python_file);
|
||||
PyRun_SimpleFile (PyFile_AsFile (python_file), filename);
|
||||
do_cleanups (cleanup);
|
||||
+
|
||||
+#endif /* _WIN32 */
|
||||
}
|
||||
|
||||
/* Given a command_line, return a command string suitable for passing
|
||||
@@ -595,17 +594,17 @@ gdbpy_parse_and_eval (PyObject *self, Py
|
||||
}
|
||||
|
||||
/* Read a file as Python code.
|
||||
- FILE is the name of the file.
|
||||
+ FILE is the file to run. FILENAME is name of the file FILE.
|
||||
This does not throw any errors. If an exception occurs python will print
|
||||
the traceback and clear the error indicator. */
|
||||
|
||||
void
|
||||
-source_python_script (const char *file)
|
||||
+source_python_script (FILE *file, const char *filename)
|
||||
{
|
||||
struct cleanup *cleanup;
|
||||
|
||||
cleanup = ensure_python_env (get_current_arch (), current_language);
|
||||
- python_run_simple_file (file);
|
||||
+ python_run_simple_file (file, filename);
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
@@ -980,19 +979,20 @@ gdbpy_progspaces (PyObject *unused1, PyO
|
||||
source_python_script_for_objfile; it is NULL at other times. */
|
||||
static struct objfile *gdbpy_current_objfile;
|
||||
|
||||
-/* Set the current objfile to OBJFILE and then read FILE as Python code.
|
||||
- This does not throw any errors. If an exception occurs python will print
|
||||
- the traceback and clear the error indicator. */
|
||||
+/* Set the current objfile to OBJFILE and then read FILE named FILENAME
|
||||
+ as Python code. This does not throw any errors. If an exception
|
||||
+ occurs python will print the traceback and clear the error indicator. */
|
||||
|
||||
void
|
||||
-source_python_script_for_objfile (struct objfile *objfile, const char *file)
|
||||
+source_python_script_for_objfile (struct objfile *objfile, FILE *file,
|
||||
+ const char *filename)
|
||||
{
|
||||
struct cleanup *cleanups;
|
||||
|
||||
cleanups = ensure_python_env (get_objfile_arch (objfile), current_language);
|
||||
gdbpy_current_objfile = objfile;
|
||||
|
||||
- python_run_simple_file (file);
|
||||
+ python_run_simple_file (file, filename);
|
||||
|
||||
do_cleanups (cleanups);
|
||||
gdbpy_current_objfile = NULL;
|
||||
@@ -1068,7 +1068,7 @@ eval_python_from_control_command (struct
|
||||
}
|
||||
|
||||
void
|
||||
-source_python_script (const char *file)
|
||||
+source_python_script (FILE *file, const char *filename)
|
||||
{
|
||||
throw_error (UNSUPPORTED_ERROR,
|
||||
_("Python scripting is not supported in this copy of GDB."));
|
||||
Index: gdb-7.3.50.20110722/gdb/python/python.h
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/python.h 2012-04-18 23:38:50.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/python.h 2012-04-18 23:40:19.181784956 +0200
|
||||
@@ -30,7 +30,7 @@ extern void finish_python_initialization
|
||||
|
||||
void eval_python_from_control_command (struct command_line *);
|
||||
|
||||
-void source_python_script (const char *file);
|
||||
+void source_python_script (FILE *file, const char *filename);
|
||||
|
||||
void run_python_script (int argc, char **argv);
|
||||
|
|
@ -0,0 +1,141 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-03/msg00234.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/03/19 18:13:39 1.14025
|
||||
### src/gdb/ChangeLog 2012/03/19 18:16:17 1.14026
|
||||
## -1,3 +1,14 @@
|
||||
+2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ Code cleanup.
|
||||
+ * main.c (struct cmdarg): Move it here from main. Add more comments.
|
||||
+ (cmdarg_s, VEC (cmdarg_s)): New.
|
||||
+ (main): Move struct cmdarg from here. New variables cmdarg_vec and
|
||||
+ cmdarg_p. Remove variables cmdsize and ncmd and their initialization.
|
||||
+ Install cleanup for cmdarg_vec. Update filling for options 'x' and
|
||||
+ 'X'. Replace cmdarg processing by cmdarg_vec processing. Remove xfree
|
||||
+ of CMDARG.
|
||||
+
|
||||
2012-03-19 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* gnu-v3-abi.c (gnuv3_print_vtable): Initialize 'result_vec'.
|
||||
Index: gdb-7.3.50.20110722/gdb/main.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/main.c 2012-04-18 23:38:42.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/main.c 2012-04-18 23:42:28.152479249 +0200
|
||||
@@ -275,6 +275,25 @@ exec_or_core_file_attach (char *filename
|
||||
}
|
||||
}
|
||||
|
||||
+/* Arguments of --command option and its counterpart. */
|
||||
+typedef struct cmdarg {
|
||||
+ /* Type of this option. */
|
||||
+ enum {
|
||||
+ /* Option type -x. */
|
||||
+ CMDARG_FILE,
|
||||
+
|
||||
+ /* Option type -ex. */
|
||||
+ CMDARG_COMMAND
|
||||
+ } type;
|
||||
+
|
||||
+ /* Value of this option - filename or the GDB command itself. String memory
|
||||
+ is not owned by this structure despite it is 'const'. */
|
||||
+ char *string;
|
||||
+} cmdarg_s;
|
||||
+
|
||||
+/* Define type VEC (cmdarg_s). */
|
||||
+DEF_VEC_O (cmdarg_s);
|
||||
+
|
||||
static int
|
||||
captured_main (void *data)
|
||||
{
|
||||
@@ -301,17 +320,8 @@ captured_main (void *data)
|
||||
static int print_version;
|
||||
|
||||
/* Pointers to all arguments of --command option. */
|
||||
- struct cmdarg {
|
||||
- enum {
|
||||
- CMDARG_FILE,
|
||||
- CMDARG_COMMAND
|
||||
- } type;
|
||||
- char *string;
|
||||
- } *cmdarg;
|
||||
- /* Allocated size of cmdarg. */
|
||||
- int cmdsize;
|
||||
- /* Number of elements of cmdarg used. */
|
||||
- int ncmd;
|
||||
+ VEC (cmdarg_s) *cmdarg_vec = NULL;
|
||||
+ struct cmdarg *cmdarg_p;
|
||||
|
||||
/* Indices of all arguments of --directory option. */
|
||||
char **dirarg;
|
||||
@@ -344,9 +354,7 @@ captured_main (void *data)
|
||||
lim_at_start = (char *) sbrk (0);
|
||||
#endif
|
||||
|
||||
- cmdsize = 1;
|
||||
- cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg));
|
||||
- ncmd = 0;
|
||||
+ make_cleanup (VEC_cleanup (cmdarg_s), &cmdarg_vec);
|
||||
dirsize = 1;
|
||||
dirarg = (char **) xmalloc (dirsize * sizeof (*dirarg));
|
||||
ndir = 0;
|
||||
@@ -577,24 +585,19 @@ captured_main (void *data)
|
||||
pidarg = optarg;
|
||||
break;
|
||||
case 'x':
|
||||
- cmdarg[ncmd].type = CMDARG_FILE;
|
||||
- cmdarg[ncmd++].string = optarg;
|
||||
- if (ncmd >= cmdsize)
|
||||
- {
|
||||
- cmdsize *= 2;
|
||||
- cmdarg = xrealloc ((char *) cmdarg,
|
||||
- cmdsize * sizeof (*cmdarg));
|
||||
- }
|
||||
+ {
|
||||
+ struct cmdarg cmdarg = { CMDARG_FILE, optarg };
|
||||
+
|
||||
+ VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
||||
+ }
|
||||
break;
|
||||
case 'X':
|
||||
- cmdarg[ncmd].type = CMDARG_COMMAND;
|
||||
- cmdarg[ncmd++].string = optarg;
|
||||
- if (ncmd >= cmdsize)
|
||||
- {
|
||||
- cmdsize *= 2;
|
||||
- cmdarg = xrealloc ((char *) cmdarg,
|
||||
- cmdsize * sizeof (*cmdarg));
|
||||
- }
|
||||
+ {
|
||||
+ struct cmdarg cmdarg = { CMDARG_COMMAND, optarg };
|
||||
+
|
||||
+ VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
||||
+ }
|
||||
+ break;
|
||||
break;
|
||||
case 'B':
|
||||
batch_flag = batch_silent = 1;
|
||||
@@ -985,16 +988,18 @@ captured_main (void *data)
|
||||
ALL_OBJFILES (objfile)
|
||||
load_auto_scripts_for_objfile (objfile);
|
||||
|
||||
- for (i = 0; i < ncmd; i++)
|
||||
+ for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++)
|
||||
+ switch (cmdarg_p->type)
|
||||
{
|
||||
- if (cmdarg[i].type == CMDARG_FILE)
|
||||
- catch_command_errors (source_script, cmdarg[i].string,
|
||||
+ case CMDARG_FILE:
|
||||
+ catch_command_errors (source_script, cmdarg_p->string,
|
||||
!batch_flag, RETURN_MASK_ALL);
|
||||
- else /* cmdarg[i].type == CMDARG_COMMAND */
|
||||
- catch_command_errors (execute_command, cmdarg[i].string,
|
||||
+ break;
|
||||
+ case CMDARG_COMMAND:
|
||||
+ catch_command_errors (execute_command, cmdarg_p->string,
|
||||
!batch_flag, RETURN_MASK_ALL);
|
||||
+ break;
|
||||
}
|
||||
- xfree (cmdarg);
|
||||
|
||||
/* Read in the old history after all the command files have been
|
||||
read. */
|
|
@ -0,0 +1,244 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-03/msg00235.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/03/19 18:16:17 1.14026
|
||||
### src/gdb/ChangeLog 2012/03/19 18:19:23 1.14027
|
||||
## -1,5 +1,18 @@
|
||||
2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
+ * NEWS: Describe new options --init-command=FILE, -ix and
|
||||
+ --init-eval-command=COMMAND, -iex.
|
||||
+ * main.c (struct cmdarg): New enum items CMDARG_INIT_FILE and
|
||||
+ CMDARG_INIT_COMMAND.
|
||||
+ (captured_main): New enum items OPT_IX and OPT_IEX. Add
|
||||
+ "init-command", "init-eval-command", "ix" and "iex" to the variable
|
||||
+ long_options. Handle OPT_IX and OPT_IEX. Process them from CMDARG_VEC.
|
||||
+ New comment for CMDARG_FILE and CMDARG_COMMAND processing.
|
||||
+ (print_gdb_help): Describe --init-command=FILE, -ix and
|
||||
+ --init-eval-command=COMMAND, -iex.
|
||||
+
|
||||
+2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
Code cleanup.
|
||||
* main.c (struct cmdarg): Move it here from main. Add more comments.
|
||||
(cmdarg_s, VEC (cmdarg_s)): New.
|
||||
Index: gdb-7.3.1/gdb/NEWS
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/NEWS 2012-04-20 22:34:14.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/NEWS 2012-04-20 22:36:12.239635484 +0200
|
||||
@@ -12,6 +12,13 @@ info auto-load-scripts [REGEXP]
|
||||
This command was formerly named "maintenance print section-scripts".
|
||||
It is now generally useful and is no longer a maintenance-only command.
|
||||
|
||||
+* New command line options
|
||||
+
|
||||
+--init-command=FILE, -ix Like --command, -x but execute it
|
||||
+ before loading inferior.
|
||||
+--init-eval-command=COMMAND, -iex Like --eval-command=COMMAND, -ex but
|
||||
+ execute it before loading inferior.
|
||||
+
|
||||
*** Changes in GDB 7.3.1
|
||||
|
||||
* The build failure for NetBSD and OpenBSD targets have now been fixed.
|
||||
Index: gdb-7.3.1/gdb/main.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/main.c 2012-04-20 22:35:34.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/main.c 2012-04-20 22:35:59.377667511 +0200
|
||||
@@ -281,7 +281,13 @@ typedef struct cmdarg {
|
||||
CMDARG_FILE,
|
||||
|
||||
/* Option type -ex. */
|
||||
- CMDARG_COMMAND
|
||||
+ CMDARG_COMMAND,
|
||||
+
|
||||
+ /* Option type -ix. */
|
||||
+ CMDARG_INIT_FILE,
|
||||
+
|
||||
+ /* Option type -iex. */
|
||||
+ CMDARG_INIT_COMMAND
|
||||
} type;
|
||||
|
||||
/* Value of this option - filename or the GDB command itself. String memory
|
||||
@@ -428,7 +434,9 @@ captured_main (void *data)
|
||||
OPT_STATISTICS,
|
||||
OPT_TUI,
|
||||
OPT_NOWINDOWS,
|
||||
- OPT_WINDOWS
|
||||
+ OPT_WINDOWS,
|
||||
+ OPT_IX,
|
||||
+ OPT_IEX
|
||||
};
|
||||
static struct option long_options[] =
|
||||
{
|
||||
@@ -469,6 +477,10 @@ captured_main (void *data)
|
||||
{"version", no_argument, &print_version, 1},
|
||||
{"x", required_argument, 0, 'x'},
|
||||
{"ex", required_argument, 0, 'X'},
|
||||
+ {"init-command", required_argument, 0, OPT_IX},
|
||||
+ {"init-eval-command", required_argument, 0, OPT_IEX},
|
||||
+ {"ix", required_argument, 0, OPT_IX},
|
||||
+ {"iex", required_argument, 0, OPT_IEX},
|
||||
#ifdef GDBTK
|
||||
{"tclcommand", required_argument, 0, 'z'},
|
||||
{"enable-external-editor", no_argument, 0, 'y'},
|
||||
@@ -597,6 +609,19 @@ captured_main (void *data)
|
||||
VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
||||
}
|
||||
break;
|
||||
+ case OPT_IX:
|
||||
+ {
|
||||
+ struct cmdarg cmdarg = { CMDARG_INIT_FILE, optarg };
|
||||
+
|
||||
+ VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
||||
+ }
|
||||
+ break;
|
||||
+ case OPT_IEX:
|
||||
+ {
|
||||
+ struct cmdarg cmdarg = { CMDARG_INIT_COMMAND, optarg };
|
||||
+
|
||||
+ VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
||||
+ }
|
||||
break;
|
||||
case 'B':
|
||||
batch_flag = batch_silent = 1;
|
||||
@@ -871,6 +896,20 @@ captured_main (void *data)
|
||||
quit_pre_print = error_pre_print;
|
||||
warning_pre_print = _("\nwarning: ");
|
||||
|
||||
+ /* Process '-ix' and '-iex' options early. */
|
||||
+ for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++)
|
||||
+ switch (cmdarg_p->type)
|
||||
+ {
|
||||
+ case CMDARG_INIT_FILE:
|
||||
+ catch_command_errors (source_script, cmdarg_p->string,
|
||||
+ !batch_flag, RETURN_MASK_ALL);
|
||||
+ break;
|
||||
+ case CMDARG_INIT_COMMAND:
|
||||
+ catch_command_errors (execute_command, cmdarg_p->string,
|
||||
+ !batch_flag, RETURN_MASK_ALL);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
/* Read and execute the system-wide gdbinit file, if it exists.
|
||||
This is done *before* all the command line arguments are
|
||||
processed; it sets global parameters, which are independent of
|
||||
@@ -987,6 +1026,7 @@ captured_main (void *data)
|
||||
ALL_OBJFILES (objfile)
|
||||
load_auto_scripts_for_objfile (objfile);
|
||||
|
||||
+ /* Process '-x' and '-ex' options. */
|
||||
for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++)
|
||||
switch (cmdarg_p->type)
|
||||
{
|
||||
@@ -1087,6 +1127,8 @@ Options:\n\n\
|
||||
Execute a single GDB command.\n\
|
||||
May be used multiple times and in conjunction\n\
|
||||
with --command.\n\
|
||||
+ --init-command=FILE, -ix Like -x but execute it before loading inferior.\n\
|
||||
+ --init-eval-command=COMMAND, -iex Like -ex but before loading inferior.\n\
|
||||
--core=COREFILE Analyze the core dump COREFILE.\n\
|
||||
--pid=PID Attach to running process PID.\n\
|
||||
"), stream);
|
||||
Index: gdb-7.3.1/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/doc/gdb.texinfo 2012-04-20 22:34:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/doc/gdb.texinfo 2012-04-20 22:35:59.383667495 +0200
|
||||
@@ -993,6 +993,22 @@ also be interleaved with @samp{-command}
|
||||
-x setbreakpoints -ex 'run' a.out
|
||||
@end smallexample
|
||||
|
||||
+@item -init-command @var{file}
|
||||
+@itemx -ix @var{file}
|
||||
+@cindex @code{--init-command}
|
||||
+@cindex @code{-ix}
|
||||
+Execute commands from file @var{file} before loading gdbinit files or the
|
||||
+inferior.
|
||||
+@xref{Startup}.
|
||||
+
|
||||
+@item -init-eval-command @var{command}
|
||||
+@itemx -iex @var{command}
|
||||
+@cindex @code{--init-eval-command}
|
||||
+@cindex @code{-iex}
|
||||
+Execute a single @value{GDBN} command before loading gdbinit files or the
|
||||
+inferior.
|
||||
+@xref{Startup}.
|
||||
+
|
||||
@item -directory @var{directory}
|
||||
@itemx -d @var{directory}
|
||||
@cindex @code{--directory}
|
||||
@@ -1255,6 +1271,13 @@ Sets up the command interpreter as speci
|
||||
(@pxref{Mode Options, interpreter}).
|
||||
|
||||
@item
|
||||
+Executes commands and command files specified by the @samp{-iex} and
|
||||
+@samp{-ix} options in their specified order. Usually you should use the
|
||||
+@samp{-ex} and @samp{-x} options instead, but this way you can apply
|
||||
+settings before @value{GDBN} init files get executed and before inferior
|
||||
+gets loaded.
|
||||
+
|
||||
+@item
|
||||
@cindex init file
|
||||
Reads the system-wide @dfn{init file} (if @option{--with-system-gdbinit} was
|
||||
used when building @value{GDBN}; @pxref{System-wide configuration,
|
||||
@@ -1288,14 +1311,11 @@ If you wish to disable the auto-loading
|
||||
you must do something like the following:
|
||||
|
||||
@smallexample
|
||||
-$ gdb -ex "set auto-load-scripts off" -ex "file myprogram"
|
||||
+$ gdb -iex "set auto-load-scripts off" myprogram
|
||||
@end smallexample
|
||||
|
||||
-The following does not work because the auto-loading is turned off too late:
|
||||
-
|
||||
-@smallexample
|
||||
-$ gdb -ex "set auto-load-scripts off" myprogram
|
||||
-@end smallexample
|
||||
+Option @samp{-ex} does not work because the auto-loading is then turned
|
||||
+off too late.
|
||||
|
||||
@item
|
||||
Reads command files specified by the @samp{-x} option. @xref{Command
|
||||
Index: gdb-7.3.1/gdb/testsuite/gdb.gdb/selftest.exp
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/testsuite/gdb.gdb/selftest.exp 2012-04-20 22:33:53.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/testsuite/gdb.gdb/selftest.exp 2012-04-20 22:35:59.383667495 +0200
|
||||
@@ -96,6 +96,10 @@ proc do_steps_and_nexts {} {
|
||||
set description "step over python_script initialization"
|
||||
set command "step"
|
||||
}
|
||||
+ -re ".*cmdarg_vec = NULL.*$gdb_prompt $" {
|
||||
+ set description "step over cmdarg_vec initialization"
|
||||
+ set command "step"
|
||||
+ }
|
||||
-re ".*pre_stat_chain = make_command_stats_cleanup.*$gdb_prompt $" {
|
||||
set description "next over make_command_stats_cleanup and everything it calls"
|
||||
set command "next"
|
||||
@@ -132,18 +136,6 @@ proc do_steps_and_nexts {} {
|
||||
set description "next over conditional stack alignment alloca"
|
||||
set command "next"
|
||||
}
|
||||
- -re ".*cmdsize = 1.*$gdb_prompt $" {
|
||||
- set description "step over cmdsize initialization"
|
||||
- set command "next"
|
||||
- }
|
||||
- -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" {
|
||||
- set description "next over cmdarg initialization via xmalloc"
|
||||
- set command "next"
|
||||
- }
|
||||
- -re ".*ncmd = 0.*$gdb_prompt $" {
|
||||
- set description "next over ncmd initialization"
|
||||
- set command "next"
|
||||
- }
|
||||
-re ".*dirsize = 1.*$gdb_prompt $" {
|
||||
set description "next over dirsize initialization"
|
||||
set command "next"
|
||||
@@ -167,6 +159,10 @@ proc do_steps_and_nexts {} {
|
||||
set description "next over textdomain PACKAGE"
|
||||
set command "next"
|
||||
}
|
||||
+ -re ".*VEC_cleanup .cmdarg_s.*$gdb_prompt $" {
|
||||
+ set description "next over cmdarg_s VEC_cleanup"
|
||||
+ set command "next"
|
||||
+ }
|
||||
-re "\[0-9\]+\[\t \]+\{\r\n$gdb_prompt $" {
|
||||
set description "step over initial brace"
|
||||
set command "step"
|
|
@ -0,0 +1,73 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-03/msg00236.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/03/19 18:19:23 1.14027
|
||||
### src/gdb/ChangeLog 2012/03/19 18:23:51 1.14028
|
||||
## -1,5 +1,13 @@
|
||||
2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
+ Code cleanup.
|
||||
+ * python/py-auto-load.c (source_section_scripts): New variable back_to.
|
||||
+ Turn fclose and xfree calls into make_cleanup_fclose and make_cleanup
|
||||
+ with xfree.
|
||||
+ (auto_load_objfile_script): Turn fclose into make_cleanup_fclose.
|
||||
+
|
||||
+2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
* NEWS: Describe new options --init-command=FILE, -ix and
|
||||
--init-eval-command=COMMAND, -iex.
|
||||
* main.c (struct cmdarg): New enum items CMDARG_INIT_FILE and
|
||||
Index: gdb-7.3.50.20110722/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/python/py-auto-load.c 2012-04-18 23:40:45.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/python/py-auto-load.c 2012-04-18 23:43:59.643262382 +0200
|
||||
@@ -254,6 +254,7 @@ source_section_scripts (struct objfile *
|
||||
FILE *stream;
|
||||
char *full_path;
|
||||
int opened, in_hash_table;
|
||||
+ struct cleanup *back_to;
|
||||
|
||||
if (*p != 1)
|
||||
{
|
||||
@@ -286,6 +287,13 @@ source_section_scripts (struct objfile *
|
||||
opened = find_and_open_script (file, 1 /*search_path*/,
|
||||
&stream, &full_path);
|
||||
|
||||
+ back_to = make_cleanup (null_cleanup, NULL);
|
||||
+ if (opened)
|
||||
+ {
|
||||
+ make_cleanup_fclose (stream);
|
||||
+ make_cleanup (xfree, full_path);
|
||||
+ }
|
||||
+
|
||||
/* If one script isn't found it's not uncommon for more to not be
|
||||
found either. We don't want to print an error message for each
|
||||
script, too much noise. Instead, we print the warning once and tell
|
||||
@@ -313,9 +321,9 @@ Use `info auto-load-scripts [REGEXP]' to
|
||||
/* If this file is not currently loaded, load it. */
|
||||
if (! in_hash_table)
|
||||
source_python_script_for_objfile (objfile, stream, full_path);
|
||||
- fclose (stream);
|
||||
- free (full_path);
|
||||
}
|
||||
+
|
||||
+ do_cleanups (back_to);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,6 +428,8 @@ auto_load_objfile_script (struct objfile
|
||||
{
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
|
||||
+ make_cleanup_fclose (input);
|
||||
+
|
||||
/* Add this script to the hash table too so "info auto-load-scripts"
|
||||
can print it. */
|
||||
pspace_info =
|
||||
@@ -432,7 +442,6 @@ auto_load_objfile_script (struct objfile
|
||||
and these scripts are required to be idempotent under multiple
|
||||
loads anyway. */
|
||||
source_python_script_for_objfile (objfile, input, debugfile);
|
||||
- fclose (input);
|
||||
}
|
||||
|
||||
do_cleanups (cleanups);
|
|
@ -0,0 +1,59 @@
|
|||
http://sourceware.org/ml/gdb-cvs/2012-03/msg00296.html
|
||||
|
||||
### src/gdb/doc/ChangeLog 2012/03/22 08:10:41 1.1289
|
||||
### src/gdb/doc/ChangeLog 2012/03/27 20:15:20 1.1290
|
||||
## -1,3 +1,12 @@
|
||||
+2012-03-27 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ * gdb.texinfo (Auto-loading): Rename node reference
|
||||
+ '.debug_gdb_scripts section' to 'dotdebug_gdb_scripts section'.
|
||||
+ Twice.
|
||||
+ (.debug_gdb_scripts section): Rename the node ...
|
||||
+ (dotdebug_gdb_scripts section): ... here.
|
||||
+ (Maintenance Commands): Also rename this node reference.
|
||||
+
|
||||
2012-03-22 Siva Chandra Reddy <sivachandra@google.com>
|
||||
|
||||
* gdb.texinfo (Python API/Values From Inferior): Add description
|
||||
Index: gdb-7.3.1/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/doc/gdb.texinfo 2012-04-20 23:35:29.206571276 +0200
|
||||
+++ gdb-7.3.1/gdb/doc/gdb.texinfo 2012-04-20 23:35:53.052511630 +0200
|
||||
@@ -23685,8 +23685,8 @@ command, or because the inferior has loa
|
||||
@file{@var{objfile}-gdb.py} and @code{.debug_gdb_scripts} section.
|
||||
|
||||
@menu
|
||||
-* objfile-gdb.py file:: The @file{@var{objfile}-gdb.py} file
|
||||
-* .debug_gdb_scripts section:: The @code{.debug_gdb_scripts} section
|
||||
+* objfile-gdb.py file:: The @file{@var{objfile}-gdb.py} file
|
||||
+* dotdebug_gdb_scripts section:: The @code{.debug_gdb_scripts} section
|
||||
* Which flavor to choose?::
|
||||
@end menu
|
||||
|
||||
@@ -23712,7 +23712,7 @@ Print the list of all scripts that @valu
|
||||
|
||||
Also printed is the list of scripts that were mentioned in
|
||||
the @code{.debug_gdb_scripts} section and were not found
|
||||
-(@pxref{.debug_gdb_scripts section}).
|
||||
+(@pxref{dotdebug_gdb_scripts section}).
|
||||
This is useful because their names are not printed when @value{GDBN}
|
||||
tries to load them and fails. There may be many of them, and printing
|
||||
an error message for each one is problematic.
|
||||
@@ -23763,7 +23763,7 @@ is the object file's real name, as descr
|
||||
So your @file{-gdb.py} file should be careful to avoid errors if it
|
||||
is evaluated more than once.
|
||||
|
||||
-@node .debug_gdb_scripts section
|
||||
+@node dotdebug_gdb_scripts section
|
||||
@subsubsection The @code{.debug_gdb_scripts} section
|
||||
@cindex @code{.debug_gdb_scripts} section
|
||||
|
||||
@@ -31959,7 +31959,7 @@ If @var{regexp} is specified, only print
|
||||
matching @var{regexp}.
|
||||
For each script, this command prints its name as specified in the objfile,
|
||||
and the full path if known.
|
||||
-@xref{.debug_gdb_scripts section}.
|
||||
+@xref{dotdebug_gdb_scripts section}.
|
||||
|
||||
@kindex maint print statistics
|
||||
@cindex bcache statistics
|
|
@ -0,0 +1,171 @@
|
|||
[patch#4 2/8] Code cleanup: new path to VEC in utils.c
|
||||
http://sourceware.org/ml/gdb-patches/2012-04/msg00086.html
|
||||
http://sourceware.org/ml/gdb-cvs/2012-04/msg00111.html
|
||||
- reduced for the backport
|
||||
|
||||
### src/gdb/ChangeLog 2012/04/17 15:45:05 1.14110
|
||||
### src/gdb/ChangeLog 2012/04/17 15:47:08 1.14111
|
||||
## -1,6 +1,34 @@
|
||||
2012-04-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Code cleanup.
|
||||
+ * charset.c (find_charset_names): Remove variables ix and elt.
|
||||
+ Use free_char_ptr_vec.
|
||||
+ * elfread.c (build_id_to_debug_filename): New variables debugdir_vec,
|
||||
+ back_to and ix. Use dirnames_to_char_ptr_vec. Remove variable
|
||||
+ debugdir_end. New variable debugdir_len.
|
||||
+ * gdb_vecs.h (free_char_ptr_vec, make_cleanup_free_char_ptr_vec)
|
||||
+ (dirnames_to_char_ptr_vec_append, dirnames_to_char_ptr_vec): New
|
||||
+ declarations.
|
||||
+ * progspace.c (clear_program_space_solib_cache): Remove variables ix
|
||||
+ and elt. Use free_char_ptr_vec.
|
||||
+ * source.c (add_path): Remove variables argv, arg and argv_index.
|
||||
+ New variables dir_vec, back_to, ix and name.
|
||||
+ Use dirnames_to_char_ptr_vec_append. Use freeargv instead of
|
||||
+ make_cleanup_freeargv. Remove variable separator. Simplify the code
|
||||
+ no longer expecting DIRNAME_SEPARATOR.
|
||||
+ (openp): Remove variable p, p1 and len. New variables dir_vec,
|
||||
+ back_to, ix and dir. Use dirnames_to_char_ptr_vec. Simplify the code
|
||||
+ no longer expecting DIRNAME_SEPARATOR.
|
||||
+ * symfile.c (find_separate_debug_file): New variables debugdir_vec,
|
||||
+ back_to and ix. Use dirnames_to_char_ptr_vec. Remove variable
|
||||
+ debugdir_end.
|
||||
+ * utils.c (free_char_ptr_vec, do_free_char_ptr_vec)
|
||||
+ (make_cleanup_free_char_ptr_vec, dirnames_to_char_ptr_vec_append)
|
||||
+ (dirnames_to_char_ptr_vec): New functions.
|
||||
+
|
||||
+2012-04-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ Code cleanup.
|
||||
* source.c (add_path): Remove always true conditional 'p == 0' and
|
||||
unindent its code block.
|
||||
|
||||
Index: gdb-7.3.50.20110722/gdb/gdb_vecs.h
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/gdb_vecs.h 2012-04-18 23:40:04.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/gdb_vecs.h 2012-04-18 23:44:35.195178113 +0200
|
||||
@@ -25,4 +25,16 @@
|
||||
|
||||
DEF_VEC_P (char_ptr);
|
||||
|
||||
+/* From utils.c: */
|
||||
+
|
||||
+extern void free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec);
|
||||
+
|
||||
+extern struct cleanup *
|
||||
+ make_cleanup_free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec);
|
||||
+
|
||||
+extern void dirnames_to_char_ptr_vec_append (VEC (char_ptr) **vecp,
|
||||
+ const char *dirnames);
|
||||
+
|
||||
+extern VEC (char_ptr) *dirnames_to_char_ptr_vec (const char *dirnames);
|
||||
+
|
||||
#endif /* GDB_VECS_H */
|
||||
Index: gdb-7.3.50.20110722/gdb/utils.c
|
||||
===================================================================
|
||||
--- gdb-7.3.50.20110722.orig/gdb/utils.c 2012-04-18 23:38:42.000000000 +0200
|
||||
+++ gdb-7.3.50.20110722/gdb/utils.c 2012-04-18 23:45:43.106017137 +0200
|
||||
@@ -29,6 +29,7 @@
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
#endif /* HAVE_SYS_RESOURCE_H */
|
||||
+#include "gdb_vecs.h"
|
||||
|
||||
#ifdef TUI
|
||||
#include "tui/tui.h" /* For tui_get_command_dimension. */
|
||||
@@ -3707,6 +3708,95 @@ parse_pid_to_attach (char *args)
|
||||
return pid;
|
||||
}
|
||||
|
||||
+/* Call xfree for each element of CHAR_PTR_VEC and final VEC_free for
|
||||
+ CHAR_PTR_VEC itself.
|
||||
+
|
||||
+ You must not modify CHAR_PTR_VEC after it got registered with this function
|
||||
+ by make_cleanup as the CHAR_PTR_VEC base address may change on its updates.
|
||||
+ Contrary to VEC_free this function does not (cannot) clear the pointer. */
|
||||
+
|
||||
+void
|
||||
+free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec)
|
||||
+{
|
||||
+ int ix;
|
||||
+ char *name;
|
||||
+
|
||||
+ for (ix = 0; VEC_iterate (char_ptr, char_ptr_vec, ix, name); ++ix)
|
||||
+ xfree (name);
|
||||
+ VEC_free (char_ptr, char_ptr_vec);
|
||||
+}
|
||||
+
|
||||
+/* Helper for make_cleanup_free_char_ptr_vec. */
|
||||
+
|
||||
+static void
|
||||
+do_free_char_ptr_vec (void *arg)
|
||||
+{
|
||||
+ VEC (char_ptr) *char_ptr_vec = arg;
|
||||
+
|
||||
+ free_char_ptr_vec (char_ptr_vec);
|
||||
+}
|
||||
+
|
||||
+/* Make cleanup handler calling xfree for each element of CHAR_PTR_VEC and
|
||||
+ final VEC_free for CHAR_PTR_VEC itself.
|
||||
+
|
||||
+ You must not modify CHAR_PTR_VEC after this cleanup registration as the
|
||||
+ CHAR_PTR_VEC base address may change on its updates. Contrary to VEC_free
|
||||
+ this function does not (cannot) clear the pointer. */
|
||||
+
|
||||
+struct cleanup *
|
||||
+make_cleanup_free_char_ptr_vec (VEC (char_ptr) *char_ptr_vec)
|
||||
+{
|
||||
+ return make_cleanup (do_free_char_ptr_vec, char_ptr_vec);
|
||||
+}
|
||||
+
|
||||
+/* Extended version of dirnames_to_char_ptr_vec - additionally if *VECP is
|
||||
+ non-NULL the new list elements from DIRNAMES are appended to the existing
|
||||
+ *VECP list of entries. *VECP address will be updated by this call. */
|
||||
+
|
||||
+void
|
||||
+dirnames_to_char_ptr_vec_append (VEC (char_ptr) **vecp, const char *dirnames)
|
||||
+{
|
||||
+ do
|
||||
+ {
|
||||
+ size_t this_len;
|
||||
+ char *next_dir, *this_dir;
|
||||
+
|
||||
+ next_dir = strchr (dirnames, DIRNAME_SEPARATOR);
|
||||
+ if (next_dir == NULL)
|
||||
+ this_len = strlen (dirnames);
|
||||
+ else
|
||||
+ {
|
||||
+ this_len = next_dir - dirnames;
|
||||
+ next_dir++;
|
||||
+ }
|
||||
+
|
||||
+ this_dir = xmalloc (this_len + 1);
|
||||
+ memcpy (this_dir, dirnames, this_len);
|
||||
+ this_dir[this_len] = '\0';
|
||||
+ VEC_safe_push (char_ptr, *vecp, this_dir);
|
||||
+
|
||||
+ dirnames = next_dir;
|
||||
+ }
|
||||
+ while (dirnames != NULL);
|
||||
+}
|
||||
+
|
||||
+/* Split DIRNAMES by DIRNAME_SEPARATOR delimiter and return a list of all the
|
||||
+ elements in their original order. For empty string ("") DIRNAMES return
|
||||
+ list of one empty string ("") element.
|
||||
+
|
||||
+ You may modify the returned strings.
|
||||
+ Read free_char_ptr_vec for its cleanup. */
|
||||
+
|
||||
+VEC (char_ptr) *
|
||||
+dirnames_to_char_ptr_vec (const char *dirnames)
|
||||
+{
|
||||
+ VEC (char_ptr) *retval = NULL;
|
||||
+
|
||||
+ dirnames_to_char_ptr_vec_append (&retval, dirnames);
|
||||
+
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
extern initialize_file_ftype _initialize_utils;
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,737 @@
|
|||
[patch#4 5/8] set auto-load safe-path
|
||||
http://sourceware.org/ml/gdb-patches/2012-04/msg00092.html
|
||||
http://sourceware.org/ml/gdb-cvs/2012-04/msg00114.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/04/17 15:51:41 1.14113
|
||||
### src/gdb/ChangeLog 2012/04/17 15:54:28 1.14114
|
||||
## -1,5 +1,39 @@
|
||||
2012-04-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
+ New option "set auto-load safe-path".
|
||||
+ * NEWS: New commands "set auto-load safe-path"
|
||||
+ and "show auto-load safe-path".
|
||||
+ * auto-load.c: Include gdb_vecs.h, readline/tilde.h and completer.h.
|
||||
+ (auto_load_safe_path, auto_load_safe_path_vec)
|
||||
+ (auto_load_safe_path_vec_update, set_auto_load_safe_path)
|
||||
+ (show_auto_load_safe_path, add_auto_load_safe_path, filename_is_in_dir)
|
||||
+ (filename_is_in_auto_load_safe_path_vec, file_is_auto_load_safe): New.
|
||||
+ (source_gdb_script_for_objfile): New variable is_safe. Call
|
||||
+ file_is_auto_load_safe. Return if it is not.
|
||||
+ (struct loaded_script): New field loaded.
|
||||
+ (maybe_add_script): Add parameter loaded. Initialize SLOT with it.
|
||||
+ (print_script): Use LOADED indicator instead of FULL_PATH. Change
|
||||
+ output "Missing" to "No".
|
||||
+ (_initialize_auto_load): New variable cmd. Initialize
|
||||
+ auto_load_safe_path. Register "set auto-load safe-path",
|
||||
+ "show auto-load safe-path" and "add-auto-load-safe-path".
|
||||
+ * auto-load.h (maybe_add_script): Add parameter loaded.
|
||||
+ (file_is_auto_load_safe): New declaration.
|
||||
+ * config.in: Regenerate.
|
||||
+ * configure: Regenerate.
|
||||
+ * configure.ac: New parameters --with-auto-load-safe-path
|
||||
+ and --without-auto-load-safe-path.
|
||||
+ * linux-thread-db.c (try_thread_db_load_from_pdir_1)
|
||||
+ (try_thread_db_load_from_dir): Check file_is_auto_load_safe first.
|
||||
+ * main.c (captured_main): Check file_is_auto_load_safe for
|
||||
+ LOCAL_GDBINIT.
|
||||
+ * python/py-auto-load.c (gdbpy_load_auto_script_for_objfile): New
|
||||
+ variable is_safe. Call file_is_auto_load_safe. Return if it is not.
|
||||
+ (source_section_scripts): Call file_is_auto_load_safe. Return if it is
|
||||
+ not.
|
||||
+
|
||||
+2012-04-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
auto-load: Implementation.
|
||||
* NEWS: New descriptions for "info auto-load",
|
||||
"info auto-load gdb-scripts", "info auto-load python-scripts",
|
||||
Index: gdb-7.3.1/gdb/NEWS
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/NEWS 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/NEWS 2012-04-20 23:05:22.712029423 +0200
|
||||
@@ -73,6 +73,11 @@ set auto-load libthread-db on|off
|
||||
show auto-load libthread-db
|
||||
Control auto-loading of inferior specific thread debugging shared library.
|
||||
|
||||
+set auto-load safe-path <dir1>[:<dir2>...]
|
||||
+show auto-load safe-path
|
||||
+ Set a list of directories from which it is safe to auto-load files.
|
||||
+ The delimiter (':' above) may differ according to the host platform.
|
||||
+
|
||||
* New command line options
|
||||
|
||||
-data-directory DIR Specify DIR as the "data-directory".
|
||||
Index: gdb-7.3.1/gdb/auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/auto-load.c 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/auto-load.c 2012-04-20 23:05:22.712029423 +0200
|
||||
@@ -32,6 +32,9 @@
|
||||
#include "gdbcmd.h"
|
||||
#include "cli/cli-decode.h"
|
||||
#include "cli/cli-setshow.h"
|
||||
+#include "gdb_vecs.h"
|
||||
+#include "readline/tilde.h"
|
||||
+#include "completer.h"
|
||||
|
||||
/* The suffix of per-objfile scripts to auto-load as non-Python command files.
|
||||
E.g. When the program loads libfoo.so, look for libfoo-gdb.gdb. */
|
||||
@@ -90,6 +93,181 @@ show_auto_load_local_gdbinit (struct ui_
|
||||
value);
|
||||
}
|
||||
|
||||
+/* Directory list safe to hold auto-loaded files. It is not checked for
|
||||
+ absolute paths but they are strongly recommended. It is initialized by
|
||||
+ _initialize_auto_load. */
|
||||
+static char *auto_load_safe_path;
|
||||
+
|
||||
+/* Vector of directory elements of AUTO_LOAD_SAFE_PATH with each one normalized
|
||||
+ by tilde_expand and possibly each entries has added its gdb_realpath
|
||||
+ counterpart. */
|
||||
+static VEC (char_ptr) *auto_load_safe_path_vec;
|
||||
+
|
||||
+/* Update auto_load_safe_path_vec from current AUTO_LOAD_SAFE_PATH. */
|
||||
+
|
||||
+static void
|
||||
+auto_load_safe_path_vec_update (void)
|
||||
+{
|
||||
+ VEC (char_ptr) *dir_vec = NULL;
|
||||
+ unsigned len;
|
||||
+ int ix;
|
||||
+
|
||||
+ free_char_ptr_vec (auto_load_safe_path_vec);
|
||||
+
|
||||
+ auto_load_safe_path_vec = dirnames_to_char_ptr_vec (auto_load_safe_path);
|
||||
+ len = VEC_length (char_ptr, auto_load_safe_path_vec);
|
||||
+
|
||||
+ /* Apply tilde_expand and gdb_realpath to each AUTO_LOAD_SAFE_PATH_VEC
|
||||
+ element. */
|
||||
+ for (ix = 0; ix < len; ix++)
|
||||
+ {
|
||||
+ char *dir = VEC_index (char_ptr, auto_load_safe_path_vec, ix);
|
||||
+ char *expanded = tilde_expand (dir);
|
||||
+ char *real_path = gdb_realpath (expanded);
|
||||
+
|
||||
+ /* Ensure the current entry is at least tilde_expand-ed. */
|
||||
+ xfree (dir);
|
||||
+ VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded);
|
||||
+
|
||||
+ /* If gdb_realpath returns a different content, append it. */
|
||||
+ if (strcmp (real_path, expanded) == 0)
|
||||
+ xfree (real_path);
|
||||
+ else
|
||||
+ VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* "set" command for the auto_load_safe_path configuration variable. */
|
||||
+
|
||||
+static void
|
||||
+set_auto_load_safe_path (char *args, int from_tty, struct cmd_list_element *c)
|
||||
+{
|
||||
+ auto_load_safe_path_vec_update ();
|
||||
+}
|
||||
+
|
||||
+/* "show" command for the auto_load_safe_path configuration variable. */
|
||||
+
|
||||
+static void
|
||||
+show_auto_load_safe_path (struct ui_file *file, int from_tty,
|
||||
+ struct cmd_list_element *c, const char *value)
|
||||
+{
|
||||
+ if (*value == 0)
|
||||
+ fprintf_filtered (file, _("Auto-load files are safe to load from any "
|
||||
+ "directory.\n"));
|
||||
+ else
|
||||
+ fprintf_filtered (file, _("List of directories from which it is safe to "
|
||||
+ "auto-load files is %s.\n"),
|
||||
+ value);
|
||||
+}
|
||||
+
|
||||
+/* "add-auto-load-safe-path" command for the auto_load_safe_path configuration
|
||||
+ variable. */
|
||||
+
|
||||
+static void
|
||||
+add_auto_load_safe_path (char *args, int from_tty)
|
||||
+{
|
||||
+ char *s;
|
||||
+
|
||||
+ if (args == NULL || *args == 0)
|
||||
+ error (_("\
|
||||
+Adding empty directory element disables the auto-load safe-path security. \
|
||||
+Use 'set auto-load safe-path' instead if you mean that."));
|
||||
+
|
||||
+ s = xstrprintf ("%s%c%s", auto_load_safe_path, DIRNAME_SEPARATOR, args);
|
||||
+ xfree (auto_load_safe_path);
|
||||
+ auto_load_safe_path = s;
|
||||
+
|
||||
+ auto_load_safe_path_vec_update ();
|
||||
+}
|
||||
+
|
||||
+/* Return 1 if FILENAME is equal to DIR or if FILENAME belongs to the
|
||||
+ subdirectory DIR. Return 0 otherwise. gdb_realpath normalization is never
|
||||
+ done here. */
|
||||
+
|
||||
+static ATTRIBUTE_PURE int
|
||||
+filename_is_in_dir (const char *filename, const char *dir)
|
||||
+{
|
||||
+ size_t dir_len = strlen (dir);
|
||||
+
|
||||
+ while (dir_len && IS_DIR_SEPARATOR (dir[dir_len - 1]))
|
||||
+ dir_len--;
|
||||
+
|
||||
+ return (filename_ncmp (dir, filename, dir_len) == 0
|
||||
+ && (IS_DIR_SEPARATOR (filename[dir_len])
|
||||
+ || filename[dir_len] == '\0'));
|
||||
+}
|
||||
+
|
||||
+/* Return 1 if FILENAME belongs to one of directory components of
|
||||
+ AUTO_LOAD_SAFE_PATH_VEC. Return 0 otherwise.
|
||||
+ auto_load_safe_path_vec_update is never called.
|
||||
+ *FILENAME_REALP may be updated by gdb_realpath of FILENAME - it has to be
|
||||
+ freed by the caller. */
|
||||
+
|
||||
+static int
|
||||
+filename_is_in_auto_load_safe_path_vec (const char *filename,
|
||||
+ char **filename_realp)
|
||||
+{
|
||||
+ char *dir;
|
||||
+ int ix;
|
||||
+
|
||||
+ for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, dir); ++ix)
|
||||
+ if (*filename_realp == NULL && filename_is_in_dir (filename, dir))
|
||||
+ break;
|
||||
+
|
||||
+ if (dir == NULL)
|
||||
+ {
|
||||
+ if (*filename_realp == NULL)
|
||||
+ *filename_realp = gdb_realpath (filename);
|
||||
+
|
||||
+ for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, dir);
|
||||
+ ++ix)
|
||||
+ if (filename_is_in_dir (*filename_realp, dir))
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (dir != NULL)
|
||||
+ return 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* Return 1 if FILENAME is located in one of the directories of
|
||||
+ AUTO_LOAD_SAFE_PATH. Otherwise call warning and return 0. FILENAME does
|
||||
+ not have to be an absolute path.
|
||||
+
|
||||
+ Existence of FILENAME is not checked. Function will still give a warning
|
||||
+ even if the caller would quietly skip non-existing file in unsafe
|
||||
+ directory. */
|
||||
+
|
||||
+int
|
||||
+file_is_auto_load_safe (const char *filename)
|
||||
+{
|
||||
+ char *filename_real = NULL;
|
||||
+ struct cleanup *back_to;
|
||||
+
|
||||
+ back_to = make_cleanup (free_current_contents, &filename_real);
|
||||
+
|
||||
+ if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real))
|
||||
+ {
|
||||
+ do_cleanups (back_to);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ auto_load_safe_path_vec_update ();
|
||||
+ if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real))
|
||||
+ {
|
||||
+ do_cleanups (back_to);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ warning (_("File \"%s\" auto-loading has been declined by your "
|
||||
+ "`auto-load safe-path' set to \"%s\"."),
|
||||
+ filename_real, auto_load_safe_path);
|
||||
+
|
||||
+ do_cleanups (back_to);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* Definition of script language for GDB canned sequences of commands. */
|
||||
|
||||
static const struct script_language script_language_gdb
|
||||
@@ -99,13 +277,20 @@ static void
|
||||
source_gdb_script_for_objfile (struct objfile *objfile, FILE *file,
|
||||
const char *filename)
|
||||
{
|
||||
+ int is_safe;
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
volatile struct gdb_exception e;
|
||||
|
||||
+ is_safe = file_is_auto_load_safe (filename);
|
||||
+
|
||||
/* Add this script to the hash table too so "info auto-load gdb-scripts"
|
||||
can print it. */
|
||||
pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
|
||||
- maybe_add_script (pspace_info, filename, filename, &script_language_gdb);
|
||||
+ maybe_add_script (pspace_info, is_safe, filename, filename,
|
||||
+ &script_language_gdb);
|
||||
+
|
||||
+ if (!is_safe)
|
||||
+ return;
|
||||
|
||||
TRY_CATCH (e, RETURN_MASK_ALL)
|
||||
{
|
||||
@@ -140,6 +325,9 @@ struct loaded_script
|
||||
inaccessible). */
|
||||
const char *full_path;
|
||||
|
||||
+ /* Non-zero if this script has been loaded. */
|
||||
+ int loaded;
|
||||
+
|
||||
const struct script_language *language;
|
||||
};
|
||||
|
||||
@@ -232,12 +420,13 @@ get_auto_load_pspace_data_for_loading (s
|
||||
return info;
|
||||
}
|
||||
|
||||
-/* Add script NAME in LANGUAGE to hash table of PSPACE_INFO.
|
||||
- FULL_PATH is NULL if the script wasn't found. The result is
|
||||
+/* Add script NAME in LANGUAGE to hash table of PSPACE_INFO. LOADED 1 if the
|
||||
+ script has been (is going to) be loaded, 0 otherwise (such as if it has not
|
||||
+ been found). FULL_PATH is NULL if the script wasn't found. The result is
|
||||
true if the script was already in the hash table. */
|
||||
|
||||
int
|
||||
-maybe_add_script (struct auto_load_pspace_info *pspace_info,
|
||||
+maybe_add_script (struct auto_load_pspace_info *pspace_info, int loaded,
|
||||
const char *name, const char *full_path,
|
||||
const struct script_language *language)
|
||||
{
|
||||
@@ -271,6 +460,7 @@ maybe_add_script (struct auto_load_pspac
|
||||
}
|
||||
else
|
||||
(*slot)->full_path = NULL;
|
||||
+ (*slot)->loaded = loaded;
|
||||
(*slot)->language = language;
|
||||
}
|
||||
|
||||
@@ -431,7 +621,7 @@ print_script (struct loaded_script *scri
|
||||
|
||||
chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
|
||||
|
||||
- ui_out_field_string (uiout, "loaded", script->full_path ? "Yes" : "Missing");
|
||||
+ ui_out_field_string (uiout, "loaded", script->loaded ? "Yes" : "No");
|
||||
ui_out_field_string (uiout, "script", script->name);
|
||||
ui_out_text (uiout, "\n");
|
||||
|
||||
@@ -715,6 +905,8 @@ void _initialize_auto_load (void);
|
||||
void
|
||||
_initialize_auto_load (void)
|
||||
{
|
||||
+ struct cmd_list_element *cmd;
|
||||
+
|
||||
auto_load_pspace_data
|
||||
= register_program_space_data_with_cleanup (auto_load_pspace_data_cleanup);
|
||||
|
||||
@@ -754,4 +946,30 @@ This options has security implications f
|
||||
_("Print whether current directory .gdbinit file has been loaded.\n\
|
||||
Usage: info auto-load local-gdbinit"),
|
||||
auto_load_info_cmdlist_get ());
|
||||
+
|
||||
+ auto_load_safe_path = xstrdup (DEFAULT_AUTO_LOAD_SAFE_PATH);
|
||||
+ auto_load_safe_path_vec_update ();
|
||||
+ add_setshow_optional_filename_cmd ("safe-path", class_support,
|
||||
+ &auto_load_safe_path, _("\
|
||||
+Set the list of directories from which it is safe to auto-load files."), _("\
|
||||
+Show the list of directories from which it is safe to auto-load files."), _("\
|
||||
+Various files loaded automatically for the 'set auto-load ...' options must\n\
|
||||
+be located in one of the directories listed by this option. Warning will be\n\
|
||||
+printed and file will not be used otherwise. Use empty string (or even\n\
|
||||
+empty directory entry) to allow any file for the 'set auto-load ...' options.\n\
|
||||
+This option is ignored for the kinds of files having 'set auto-load ... off'.\n\
|
||||
+This options has security implications for untrusted inferiors."),
|
||||
+ set_auto_load_safe_path,
|
||||
+ show_auto_load_safe_path,
|
||||
+ auto_load_set_cmdlist_get (),
|
||||
+ auto_load_show_cmdlist_get ());
|
||||
+
|
||||
+ cmd = add_cmd ("add-auto-load-safe-path", class_support,
|
||||
+ add_auto_load_safe_path,
|
||||
+ _("Add entries to the list of directories from which it is safe "
|
||||
+ "to auto-load files.\n\
|
||||
+See the commands 'set auto-load safe-path' and 'show auto-load safe-path' to\n\
|
||||
+access the current full list setting."),
|
||||
+ &cmdlist);
|
||||
+ set_cmd_completer (cmd, filename_completer);
|
||||
}
|
||||
Index: gdb-7.3.1/gdb/auto-load.h
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/auto-load.h 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/auto-load.h 2012-04-20 23:05:22.712029423 +0200
|
||||
@@ -39,7 +39,8 @@ extern int auto_load_local_gdbinit_loade
|
||||
extern struct auto_load_pspace_info *
|
||||
get_auto_load_pspace_data_for_loading (struct program_space *pspace);
|
||||
extern int maybe_add_script (struct auto_load_pspace_info *pspace_info,
|
||||
- const char *name, const char *full_path,
|
||||
+ int loaded, const char *name,
|
||||
+ const char *full_path,
|
||||
const struct script_language *language);
|
||||
extern void auto_load_objfile_script (struct objfile *objfile,
|
||||
const struct script_language *language);
|
||||
@@ -54,4 +55,6 @@ extern struct cmd_list_element **auto_lo
|
||||
extern struct cmd_list_element **auto_load_show_cmdlist_get (void);
|
||||
extern struct cmd_list_element **auto_load_info_cmdlist_get (void);
|
||||
|
||||
+extern int file_is_auto_load_safe (const char *filename);
|
||||
+
|
||||
#endif /* AUTO_LOAD_H */
|
||||
Index: gdb-7.3.1/gdb/config.in
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/config.in 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/config.in 2012-04-20 23:05:22.713029421 +0200
|
||||
@@ -40,6 +40,9 @@
|
||||
moved. */
|
||||
#undef DEBUGDIR_RELOCATABLE
|
||||
|
||||
+/* Directories safe to hold auto-loaded files. */
|
||||
+#undef DEFAULT_AUTO_LOAD_SAFE_PATH
|
||||
+
|
||||
/* Define to BFD's default architecture. */
|
||||
#undef DEFAULT_BFD_ARCH
|
||||
|
||||
Index: gdb-7.3.1/gdb/configure
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/configure 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/configure 2012-04-20 23:05:22.715029416 +0200
|
||||
@@ -952,6 +952,7 @@ with_separate_debug_dir
|
||||
with_gdb_datadir
|
||||
with_relocated_sources
|
||||
with_rpm
|
||||
+with_auto_load_safe_path
|
||||
enable_targets
|
||||
enable_64_bit_bfd
|
||||
enable_gdbcli
|
||||
@@ -1661,6 +1662,10 @@ Optional Packages:
|
||||
automatically relocate this path for source files
|
||||
--with-rpm query rpm database for missing debuginfos (yes/no,
|
||||
def. auto=librpm.so)
|
||||
+ --with-auto-load-safe-path=PATH
|
||||
+ directories safe to hold auto-loaded files
|
||||
+ --without-auto-load-safe-path
|
||||
+ do not restrict auto-loaded files locations
|
||||
--with-libunwind use libunwind frame unwinding support
|
||||
--with-curses use the curses library instead of the termcap
|
||||
library
|
||||
@@ -8376,6 +8381,32 @@ $as_echo "$as_me: WARNING: $RPM_PKG_ERRO
|
||||
fi
|
||||
fi
|
||||
|
||||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for default auto-load safe-path" >&5
|
||||
+$as_echo_n "checking for default auto-load safe-path... " >&6; }
|
||||
+
|
||||
+# Check whether --with-auto-load-safe-path was given.
|
||||
+if test "${with_auto_load_safe_path+set}" = set; then :
|
||||
+ withval=$with_auto_load_safe_path; if test "$with_auto_load_safe_path" = "no"; then
|
||||
+ with_auto_load_safe_path=""
|
||||
+ fi
|
||||
+else
|
||||
+ with_auto_load_safe_path="$prefix"
|
||||
+fi
|
||||
+
|
||||
+
|
||||
+ test "x$prefix" = xNONE && prefix="$ac_default_prefix"
|
||||
+ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
|
||||
+ ac_define_dir=`eval echo $with_auto_load_safe_path`
|
||||
+ ac_define_dir=`eval echo $ac_define_dir`
|
||||
+
|
||||
+cat >>confdefs.h <<_ACEOF
|
||||
+#define DEFAULT_AUTO_LOAD_SAFE_PATH "$ac_define_dir"
|
||||
+_ACEOF
|
||||
+
|
||||
+
|
||||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5
|
||||
+$as_echo "$with_auto_load_safe_path" >&6; }
|
||||
+
|
||||
|
||||
|
||||
subdirs="$subdirs testsuite"
|
||||
Index: gdb-7.3.1/gdb/configure.ac
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/configure.ac 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/configure.ac 2012-04-20 23:05:22.715029416 +0200
|
||||
@@ -301,6 +301,18 @@ extern rpmdbMatchIterator rpmtsInitItera
|
||||
fi
|
||||
fi
|
||||
|
||||
+AC_MSG_CHECKING([for default auto-load safe-path])
|
||||
+AC_ARG_WITH(auto-load-safe-path,
|
||||
+AS_HELP_STRING([--with-auto-load-safe-path=PATH], [directories safe to hold auto-loaded files])
|
||||
+AS_HELP_STRING([--without-auto-load-safe-path], [do not restrict auto-loaded files locations]),
|
||||
+[if test "$with_auto_load_safe_path" = "no"; then
|
||||
+ with_auto_load_safe_path=""
|
||||
+ fi],
|
||||
+[with_auto_load_safe_path="$prefix"])
|
||||
+AC_DEFINE_DIR(DEFAULT_AUTO_LOAD_SAFE_PATH, with_auto_load_safe_path,
|
||||
+ [Directories safe to hold auto-loaded files.])
|
||||
+AC_MSG_RESULT([$with_auto_load_safe_path])
|
||||
+
|
||||
AC_CONFIG_SUBDIRS(testsuite)
|
||||
|
||||
# Check whether to support alternative target configurations
|
||||
Index: gdb-7.3.1/gdb/linux-thread-db.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/linux-thread-db.c 2012-04-20 23:05:16.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/linux-thread-db.c 2012-04-20 23:05:42.837979053 +0200
|
||||
@@ -879,7 +879,8 @@ thread_db_load_search (void)
|
||||
}
|
||||
strcat (path, "/");
|
||||
strcat (path, LIBTHREAD_DB_SO);
|
||||
- if (auto_load_thread_db && try_thread_db_load (path))
|
||||
+ if (auto_load_thread_db && file_is_auto_load_safe (path)
|
||||
+ && try_thread_db_load (path))
|
||||
{
|
||||
rc = 1;
|
||||
break;
|
||||
@@ -945,7 +946,7 @@ thread_db_load (void)
|
||||
else
|
||||
{
|
||||
strcpy (cp + 1, LIBTHREAD_DB_SO);
|
||||
- if (try_thread_db_load (path))
|
||||
+ if (file_is_auto_load_safe (path) && try_thread_db_load (path))
|
||||
return 1;
|
||||
}
|
||||
warning (_("Unable to find libthread_db matching inferior's thread"
|
||||
Index: gdb-7.3.1/gdb/main.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/main.c 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/main.c 2012-04-20 23:05:22.716029413 +0200
|
||||
@@ -1020,7 +1020,8 @@ captured_main (void *data)
|
||||
{
|
||||
auto_load_local_gdbinit_pathname = gdb_realpath (local_gdbinit);
|
||||
|
||||
- if (!inhibit_gdbinit && auto_load_local_gdbinit)
|
||||
+ if (!inhibit_gdbinit && auto_load_local_gdbinit
|
||||
+ && file_is_auto_load_safe (local_gdbinit))
|
||||
{
|
||||
auto_load_local_gdbinit_loaded = 1;
|
||||
|
||||
Index: gdb-7.3.1/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/doc/gdb.texinfo 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/doc/gdb.texinfo 2012-04-20 23:05:22.721029400 +0200
|
||||
@@ -20024,6 +20024,8 @@ gdb-scripts: Auto-loading of canned seq
|
||||
libthread-db: Auto-loading of inferior specific libthread_db is on.
|
||||
local-gdbinit: Auto-loading of .gdbinit script from current directory is on.
|
||||
python-scripts: Auto-loading of Python scripts is on.
|
||||
+safe-path: List of directories from which it is safe to auto-load files
|
||||
+ is /usr/local.
|
||||
@end smallexample
|
||||
|
||||
@anchor{info auto-load}
|
||||
@@ -20095,12 +20097,19 @@ These are @value{GDBN} control commands
|
||||
@tab Show setting of thread debugging library.
|
||||
@item @xref{info auto-load libthread-db}.
|
||||
@tab Show state of thread debugging library.
|
||||
+@item @xref{set auto-load safe-path}.
|
||||
+@tab Control directories trusted for automatic loading.
|
||||
+@item @xref{show auto-load safe-path}.
|
||||
+@tab Show directories trusted for automatic loading.
|
||||
+@item @xref{add-auto-load-safe-path}.
|
||||
+@tab Add directory trusted for automatic loading.
|
||||
@end multitable
|
||||
|
||||
@menu
|
||||
* Init File in the Current Directory:: @samp{set/show/info auto-load local-gdbinit}
|
||||
* libthread_db.so.1 file:: @samp{set/show/info auto-load libthread-db}
|
||||
* objfile-gdb.gdb file:: @samp{set/show/info auto-load gdb-script}
|
||||
+* Auto-loading safe path:: @samp{set/show/info auto-load safe-path}
|
||||
@xref{Python Auto-loading}.
|
||||
@end menu
|
||||
|
||||
@@ -20201,6 +20210,104 @@ auto-loaded.
|
||||
If @var{regexp} is supplied only canned sequences of commands scripts with
|
||||
matching names are printed.
|
||||
|
||||
+@node Auto-loading safe path
|
||||
+@subsection Security restriction for auto-loading
|
||||
+@cindex auto-loading safe-path
|
||||
+
|
||||
+As the files of inferior can come from untrusted source (such as submitted by
|
||||
+an application user) @value{GDBN} does not always load any files automatically.
|
||||
+@value{GDBN} provides the @samp{set auto-load safe-path} setting to list
|
||||
+directories trusted for loading files not explicitly requested by user.
|
||||
+
|
||||
+If the path is not set properly you will see a warning and the file will not
|
||||
+get loaded:
|
||||
+
|
||||
+@smallexample
|
||||
+$ ./gdb -q ./gdb
|
||||
+Reading symbols from /home/user/gdb/gdb...done.
|
||||
+warning: File "/home/user/gdb/gdb-gdb.gdb" auto-loading has been
|
||||
+ declined by your `auto-load safe-path' set to "/usr/local".
|
||||
+warning: File "/home/user/gdb/gdb-gdb.py" auto-loading has been
|
||||
+ declined by your `auto-load safe-path' set to "/usr/local".
|
||||
+@end smallexample
|
||||
+
|
||||
+The list of trusted directories is controlled by the following commands:
|
||||
+
|
||||
+@table @code
|
||||
+@anchor{set auto-load safe-path}
|
||||
+@kindex set auto-load safe-path
|
||||
+@item set auto-load safe-path @var{directories}
|
||||
+Set the list of directories (and their subdirectories) trusted for automatic
|
||||
+loading and execution of scripts. You can also enter a specific trusted file.
|
||||
+The list of directories uses directory separator (@samp{:} on GNU and Unix
|
||||
+systems, @samp{;} on MS-Windows and MS-DOS) to separate directories, similarly
|
||||
+to the @env{PATH} environment variable.
|
||||
+
|
||||
+@anchor{show auto-load safe-path}
|
||||
+@kindex show auto-load safe-path
|
||||
+@item show auto-load safe-path
|
||||
+Show the list of directories trusted for automatic loading and execution of
|
||||
+scripts.
|
||||
+
|
||||
+@anchor{add-auto-load-safe-path}
|
||||
+@kindex add-auto-load-safe-path
|
||||
+@item add-auto-load-safe-path
|
||||
+Add an entry (or list of entries) the list of directories trusted for automatic
|
||||
+loading and execution of scripts. Multiple entries may be delimited by the
|
||||
+host platform directory separator in use.
|
||||
+@end table
|
||||
+
|
||||
+Setting this variable to an empty string disables this security protection.
|
||||
+This variable is supposed to be set to the system directories writable by the
|
||||
+system superuser only. Users can add their source directories in init files in
|
||||
+their home directories (@pxref{Home Directory Init File}). See also deprecated
|
||||
+init file in the current directory
|
||||
+(@pxref{Init File in the Current Directory during Startup}).
|
||||
+
|
||||
+To force @value{GDBN} to load the files it declined to load in the previous
|
||||
+example, you could use one of the following ways:
|
||||
+
|
||||
+@itemize @bullet
|
||||
+@item ~/.gdbinit: add-auto-load-safe-path ~/src/gdb
|
||||
+Specify this trusted directory (or a file) as additional component of the list.
|
||||
+You have to specify also any existing directories displayed by
|
||||
+by @samp{show auto-load safe-path} (such as @samp{/usr:/bin} in this example).
|
||||
+
|
||||
+@item @kbd{gdb -iex "set auto-load safe-path /usr:/bin:~/src/gdb" [@dots{}]}
|
||||
+Specify this directory as in the previous case but just for a single
|
||||
+@value{GDBN} session.
|
||||
+
|
||||
+@item @kbd{gdb -iex "set auto-load safe-path" [@dots{}]}
|
||||
+Disable auto-loading safety for a single @value{GDBN} session.
|
||||
+This assumes all the files you debug during this @value{GDBN} session will come
|
||||
+from trusted sources.
|
||||
+
|
||||
+@item @kbd{./configure --without-auto-load-safe-path}
|
||||
+During compilation of @value{GDBN} you may disable any auto-loading safety.
|
||||
+This assumes all the files you will ever debug with this @value{GDBN} come from
|
||||
+trusted sources.
|
||||
+@end itemize
|
||||
+
|
||||
+On the other hand you can also explicitly forbid automatic files loading which
|
||||
+also suppresses any such warning messages:
|
||||
+
|
||||
+@itemize @bullet
|
||||
+@item @kbd{gdb -iex "set auto-load no" [@dots{}]}
|
||||
+You can use @value{GDBN} command-line option for a single @value{GDBN} session.
|
||||
+
|
||||
+@item @samp{~/.gdbinit}: @samp{set auto-load no}
|
||||
+Disable auto-loading globally for the user
|
||||
+(@pxref{Home Directory Init File}). While it is improbable, you could also
|
||||
+use system init file instead (@pxref{System-wide configuration}).
|
||||
+@end itemize
|
||||
+
|
||||
+This setting applies to the file names as entered by user. If no entry matches
|
||||
+@value{GDBN} tries as a last resort to also resolve all the file names into
|
||||
+their canonical form (typically resolving symbolic links) and compare the
|
||||
+entries again. @value{GDBN} already canonicalizes most of the filenames on its
|
||||
+own before starting the comparison so a canonical form of directories is
|
||||
+recommended to be entered.
|
||||
+
|
||||
@node Messages/Warnings
|
||||
@section Optional Warnings and Messages
|
||||
|
||||
@@ -23962,10 +24069,10 @@ Example:
|
||||
|
||||
@smallexample
|
||||
(gdb) info auto-load python-scripts
|
||||
-Loaded Script
|
||||
-Yes py-section-script.py
|
||||
- full name: /tmp/py-section-script.py
|
||||
-Missing my-foo-pretty-printers.py
|
||||
+Loaded Script
|
||||
+Yes py-section-script.py
|
||||
+ full name: /tmp/py-section-script.py
|
||||
+No my-foo-pretty-printers.py
|
||||
@end smallexample
|
||||
@end table
|
||||
|
||||
Index: gdb-7.3.1/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/python/py-auto-load.c 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/python/py-auto-load.c 2012-04-20 23:05:22.721029400 +0200
|
||||
@@ -72,14 +72,19 @@ static void
|
||||
gdbpy_load_auto_script_for_objfile (struct objfile *objfile, FILE *file,
|
||||
const char *filename)
|
||||
{
|
||||
+ int is_safe;
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
|
||||
+ is_safe = file_is_auto_load_safe (filename);
|
||||
+
|
||||
/* Add this script to the hash table too so "info auto-load python-scripts"
|
||||
can print it. */
|
||||
pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
|
||||
- maybe_add_script (pspace_info, filename, filename, &script_language_python);
|
||||
+ maybe_add_script (pspace_info, is_safe, filename, filename,
|
||||
+ &script_language_python);
|
||||
|
||||
- source_python_script_for_objfile (objfile, file, filename);
|
||||
+ if (is_safe)
|
||||
+ source_python_script_for_objfile (objfile, file, filename);
|
||||
}
|
||||
|
||||
/* Load scripts specified in OBJFILE.
|
||||
@@ -147,6 +152,9 @@ source_section_scripts (struct objfile *
|
||||
{
|
||||
make_cleanup_fclose (stream);
|
||||
make_cleanup (xfree, full_path);
|
||||
+
|
||||
+ if (!file_is_auto_load_safe (full_path))
|
||||
+ opened = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -167,7 +175,7 @@ Use `info auto-load python [REGEXP]' to
|
||||
|
||||
IWBN if complaints.c were more general-purpose. */
|
||||
|
||||
- in_hash_table = maybe_add_script (pspace_info, file, full_path,
|
||||
+ in_hash_table = maybe_add_script (pspace_info, opened, file, full_path,
|
||||
&script_language_python);
|
||||
|
||||
/* If this file is not currently loaded, load it. */
|
||||
Index: gdb-7.3.1/gdb/testsuite/gdb.python/py-objfile-script.exp
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/testsuite/gdb.python/py-objfile-script.exp 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/testsuite/gdb.python/py-objfile-script.exp 2012-04-20 23:05:22.722029398 +0200
|
||||
@@ -41,6 +41,7 @@ if { [skip_python_tests] } { continue }
|
||||
set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}-gdb.py ${subdir}/${testfile}-gdb.py]
|
||||
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_test_no_output "set auto-load safe-path ${remote_python_file}" "set auto-load safe-path"
|
||||
gdb_load ${binfile}
|
||||
|
||||
# Verify gdb loaded the script.
|
||||
Index: gdb-7.3.1/gdb/testsuite/gdb.python/py-section-script.exp
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/testsuite/gdb.python/py-section-script.exp 2012-04-20 23:04:26.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/testsuite/gdb.python/py-section-script.exp 2012-04-20 23:05:22.722029398 +0200
|
||||
@@ -53,6 +53,7 @@ if { [skip_python_tests] } { continue }
|
||||
set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
|
||||
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_test_no_output "set auto-load safe-path ${remote_python_file}" "set auto-load safe-path"
|
||||
gdb_load ${binfile}
|
||||
|
||||
# Verify gdb loaded the script.
|
|
@ -0,0 +1,350 @@
|
|||
[patch#4 6/8] set debug auto-load
|
||||
http://sourceware.org/ml/gdb-patches/2012-04/msg00089.html
|
||||
http://sourceware.org/ml/gdb-cvs/2012-04/msg00115.html
|
||||
|
||||
### src/gdb/ChangeLog 2012/04/17 15:54:28 1.14114
|
||||
### src/gdb/ChangeLog 2012/04/17 15:56:20 1.14115
|
||||
## -1,5 +1,27 @@
|
||||
2012-04-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
+ New option "set debug auto-load".
|
||||
+ * NEWS: New commands "set debug auto-load" and "show debug auto-load".
|
||||
+ * auto-load.c (debug_auto_load, show_debug_auto_load: New.
|
||||
+ (auto_load_safe_path_vec_update)
|
||||
+ (filename_is_in_auto_load_safe_path_vec): Call fprintf_unfiltered
|
||||
+ if DEBUG_AUTO_LOAD.
|
||||
+ (file_is_auto_load_safe): New parameters debug_fmt and ....
|
||||
+ Call fprintf_unfiltered if DEBUG_AUTO_LOAD.
|
||||
+ (source_gdb_script_for_objfile): Extend the file_is_auto_load_safe
|
||||
+ caller by explanatory string.
|
||||
+ (_initialize_auto_load): Register "set debug auto-load".
|
||||
+ * auto-load.h (file_is_auto_load_safe): New parameters debug_fmt
|
||||
+ and ....
|
||||
+ * linux-thread-db.c (try_thread_db_load_from_pdir_1)
|
||||
+ (try_thread_db_load_from_dir): Extend the file_is_auto_load_safe caller
|
||||
+ by explanatory string.
|
||||
+ * main.c (captured_main): Likewise.
|
||||
+ * python/py-auto-load.c (gdbpy_load_auto_script_for_objfile)
|
||||
+ (source_section_scripts): Likewise.
|
||||
+
|
||||
+2012-04-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
New option "set auto-load safe-path".
|
||||
* NEWS: New commands "set auto-load safe-path"
|
||||
and "show auto-load safe-path".
|
||||
Index: gdb-7.3.1/gdb/NEWS
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/NEWS 2012-04-20 23:05:22.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/NEWS 2012-04-20 23:07:15.697746730 +0200
|
||||
@@ -78,6 +78,10 @@ show auto-load safe-path
|
||||
Set a list of directories from which it is safe to auto-load files.
|
||||
The delimiter (':' above) may differ according to the host platform.
|
||||
|
||||
+set debug auto-load on|off
|
||||
+show debug auto-load
|
||||
+ Control display of debugging info for auto-loading the files above.
|
||||
+
|
||||
* New command line options
|
||||
|
||||
-data-directory DIR Specify DIR as the "data-directory".
|
||||
Index: gdb-7.3.1/gdb/auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/auto-load.c 2012-04-20 23:05:22.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/auto-load.c 2012-04-20 23:07:15.698746727 +0200
|
||||
@@ -43,6 +43,20 @@
|
||||
static void source_gdb_script_for_objfile (struct objfile *objfile, FILE *file,
|
||||
const char *filename);
|
||||
|
||||
+/* Value of the 'set debug auto-load' configuration variable. */
|
||||
+static int debug_auto_load = 0;
|
||||
+
|
||||
+/* "show" command for the debug_auto_load configuration variable. */
|
||||
+
|
||||
+static void
|
||||
+show_debug_auto_load (struct ui_file *file, int from_tty,
|
||||
+ struct cmd_list_element *c, const char *value)
|
||||
+{
|
||||
+ fprintf_filtered (file, _("Debugging output for files "
|
||||
+ "of 'set auto-load ...' is %s.\n"),
|
||||
+ value);
|
||||
+}
|
||||
+
|
||||
/* User-settable option to enable/disable auto-loading of GDB_AUTO_FILE_NAME
|
||||
scripts:
|
||||
set auto-load gdb-scripts on|off
|
||||
@@ -112,6 +126,11 @@ auto_load_safe_path_vec_update (void)
|
||||
unsigned len;
|
||||
int ix;
|
||||
|
||||
+ if (debug_auto_load)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ _("auto-load: Updating directories of \"%s\".\n"),
|
||||
+ auto_load_safe_path);
|
||||
+
|
||||
free_char_ptr_vec (auto_load_safe_path_vec);
|
||||
|
||||
auto_load_safe_path_vec = dirnames_to_char_ptr_vec (auto_load_safe_path);
|
||||
@@ -126,14 +145,34 @@ auto_load_safe_path_vec_update (void)
|
||||
char *real_path = gdb_realpath (expanded);
|
||||
|
||||
/* Ensure the current entry is at least tilde_expand-ed. */
|
||||
- xfree (dir);
|
||||
VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded);
|
||||
|
||||
+ if (debug_auto_load)
|
||||
+ {
|
||||
+ if (strcmp (expanded, dir) == 0)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ _("auto-load: Using directory \"%s\".\n"),
|
||||
+ expanded);
|
||||
+ else
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ _("auto-load: Resolved directory \"%s\" "
|
||||
+ "as \"%s\".\n"),
|
||||
+ dir, expanded);
|
||||
+ }
|
||||
+ xfree (dir);
|
||||
+
|
||||
/* If gdb_realpath returns a different content, append it. */
|
||||
if (strcmp (real_path, expanded) == 0)
|
||||
xfree (real_path);
|
||||
else
|
||||
- VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path);
|
||||
+ {
|
||||
+ VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path);
|
||||
+
|
||||
+ if (debug_auto_load)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ _("auto-load: And canonicalized as \"%s\".\n"),
|
||||
+ real_path);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,16 +256,30 @@ filename_is_in_auto_load_safe_path_vec (
|
||||
if (dir == NULL)
|
||||
{
|
||||
if (*filename_realp == NULL)
|
||||
- *filename_realp = gdb_realpath (filename);
|
||||
+ {
|
||||
+ *filename_realp = gdb_realpath (filename);
|
||||
+ if (debug_auto_load && strcmp (*filename_realp, filename) != 0)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ _("auto-load: Resolved "
|
||||
+ "file \"%s\" as \"%s\".\n"),
|
||||
+ filename, *filename_realp);
|
||||
+ }
|
||||
|
||||
- for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, dir);
|
||||
- ++ix)
|
||||
- if (filename_is_in_dir (*filename_realp, dir))
|
||||
- break;
|
||||
+ if (strcmp (*filename_realp, filename) != 0)
|
||||
+ for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, dir);
|
||||
+ ++ix)
|
||||
+ if (filename_is_in_dir (*filename_realp, dir))
|
||||
+ break;
|
||||
}
|
||||
|
||||
if (dir != NULL)
|
||||
- return 1;
|
||||
+ {
|
||||
+ if (debug_auto_load)
|
||||
+ fprintf_unfiltered (gdb_stdlog, _("auto-load: File \"%s\" matches "
|
||||
+ "directory \"%s\".\n"),
|
||||
+ filename, dir);
|
||||
+ return 1;
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -240,11 +293,20 @@ filename_is_in_auto_load_safe_path_vec (
|
||||
directory. */
|
||||
|
||||
int
|
||||
-file_is_auto_load_safe (const char *filename)
|
||||
+file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...)
|
||||
{
|
||||
char *filename_real = NULL;
|
||||
struct cleanup *back_to;
|
||||
|
||||
+ if (debug_auto_load)
|
||||
+ {
|
||||
+ va_list debug_args;
|
||||
+
|
||||
+ va_start (debug_args, debug_fmt);
|
||||
+ vfprintf_unfiltered (gdb_stdlog, debug_fmt, debug_args);
|
||||
+ va_end (debug_args);
|
||||
+ }
|
||||
+
|
||||
back_to = make_cleanup (free_current_contents, &filename_real);
|
||||
|
||||
if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real))
|
||||
@@ -281,7 +343,10 @@ source_gdb_script_for_objfile (struct ob
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
volatile struct gdb_exception e;
|
||||
|
||||
- is_safe = file_is_auto_load_safe (filename);
|
||||
+ is_safe = file_is_auto_load_safe (filename, _("auto-load: Loading canned "
|
||||
+ "sequences of commands script "
|
||||
+ "\"%s\" for objfile \"%s\".\n"),
|
||||
+ filename, objfile->name);
|
||||
|
||||
/* Add this script to the hash table too so "info auto-load gdb-scripts"
|
||||
can print it. */
|
||||
@@ -972,4 +1037,13 @@ See the commands 'set auto-load safe-pat
|
||||
access the current full list setting."),
|
||||
&cmdlist);
|
||||
set_cmd_completer (cmd, filename_completer);
|
||||
+
|
||||
+ add_setshow_boolean_cmd ("auto-load", class_maintenance,
|
||||
+ &debug_auto_load, _("\
|
||||
+Set auto-load verifications debugging."), _("\
|
||||
+Show auto-load verifications debugging."), _("\
|
||||
+When non-zero, debugging output for files of 'set auto-load ...'\n\
|
||||
+is displayed."),
|
||||
+ NULL, show_debug_auto_load,
|
||||
+ &setdebuglist, &showdebuglist);
|
||||
}
|
||||
Index: gdb-7.3.1/gdb/auto-load.h
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/auto-load.h 2012-04-20 23:05:22.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/auto-load.h 2012-04-20 23:07:15.698746727 +0200
|
||||
@@ -55,6 +55,7 @@ extern struct cmd_list_element **auto_lo
|
||||
extern struct cmd_list_element **auto_load_show_cmdlist_get (void);
|
||||
extern struct cmd_list_element **auto_load_info_cmdlist_get (void);
|
||||
|
||||
-extern int file_is_auto_load_safe (const char *filename);
|
||||
+extern int file_is_auto_load_safe (const char *filename,
|
||||
+ const char *debug_fmt, ...);
|
||||
|
||||
#endif /* AUTO_LOAD_H */
|
||||
Index: gdb-7.3.1/gdb/linux-thread-db.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/linux-thread-db.c 2012-04-20 23:05:42.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/linux-thread-db.c 2012-04-20 23:11:35.315097181 +0200
|
||||
@@ -879,7 +879,8 @@ thread_db_load_search (void)
|
||||
}
|
||||
strcat (path, "/");
|
||||
strcat (path, LIBTHREAD_DB_SO);
|
||||
- if (auto_load_thread_db && file_is_auto_load_safe (path)
|
||||
+ if (auto_load_thread_db && file_is_auto_load_safe (path, _("auto-load: Loading libthread-db "
|
||||
+"library \"%s\" from explicit " "directory.\n"), path)
|
||||
&& try_thread_db_load (path))
|
||||
{
|
||||
rc = 1;
|
||||
@@ -946,7 +947,9 @@ thread_db_load (void)
|
||||
else
|
||||
{
|
||||
strcpy (cp + 1, LIBTHREAD_DB_SO);
|
||||
- if (file_is_auto_load_safe (path) && try_thread_db_load (path))
|
||||
+ if (file_is_auto_load_safe (path, _("auto-load: Loading libthread-db "
|
||||
+"library \"%s\" from $pdir.\n"), path)
|
||||
+ && try_thread_db_load (path))
|
||||
return 1;
|
||||
}
|
||||
warning (_("Unable to find libthread_db matching inferior's thread"
|
||||
Index: gdb-7.3.1/gdb/main.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/main.c 2012-04-20 23:05:22.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/main.c 2012-04-20 23:07:15.699746724 +0200
|
||||
@@ -1021,7 +1021,10 @@ captured_main (void *data)
|
||||
auto_load_local_gdbinit_pathname = gdb_realpath (local_gdbinit);
|
||||
|
||||
if (!inhibit_gdbinit && auto_load_local_gdbinit
|
||||
- && file_is_auto_load_safe (local_gdbinit))
|
||||
+ && file_is_auto_load_safe (local_gdbinit,
|
||||
+ _("auto-load: Loading .gdbinit "
|
||||
+ "file \"%s\".\n"),
|
||||
+ local_gdbinit))
|
||||
{
|
||||
auto_load_local_gdbinit_loaded = 1;
|
||||
|
||||
Index: gdb-7.3.1/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/doc/gdb.texinfo 2012-04-20 23:05:22.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/doc/gdb.texinfo 2012-04-20 23:07:15.705746710 +0200
|
||||
@@ -20110,6 +20110,7 @@ These are @value{GDBN} control commands
|
||||
* libthread_db.so.1 file:: @samp{set/show/info auto-load libthread-db}
|
||||
* objfile-gdb.gdb file:: @samp{set/show/info auto-load gdb-script}
|
||||
* Auto-loading safe path:: @samp{set/show/info auto-load safe-path}
|
||||
+* Auto-loading verbose mode:: @samp{set/show debug auto-load}
|
||||
@xref{Python Auto-loading}.
|
||||
@end menu
|
||||
|
||||
@@ -20308,6 +20309,45 @@ entries again. @value{GDBN} already can
|
||||
own before starting the comparison so a canonical form of directories is
|
||||
recommended to be entered.
|
||||
|
||||
+@node Auto-loading verbose mode
|
||||
+@subsection Displaying files tried for auto-load
|
||||
+@cindex auto-loading verbose mode
|
||||
+
|
||||
+For better visibility of all the file locations where you can place scripts to
|
||||
+be auto-loaded with inferior --- or to protect yourself against accidental
|
||||
+execution of untrusted scripts --- @value{GDBN} provides a feature for printing
|
||||
+all the files attempted to be loaded. Both existing and non-existing files may
|
||||
+be printed.
|
||||
+
|
||||
+For example the list of directories from which it is safe to auto-load files
|
||||
+(@pxref{Auto-loading safe path}) applies also to canonicalized filenames which
|
||||
+may not be too obvious while setting it up.
|
||||
+
|
||||
+@smallexample
|
||||
+(gdb) set debug auto-load ues
|
||||
+(gdb) file ~/src/t/true
|
||||
+auto-load: Loading canned sequences of commands script "/tmp/true-gdb.gdb"
|
||||
+ for objfile "/tmp/true".
|
||||
+auto-load: Updating directories of "/usr:/opt".
|
||||
+auto-load: Using directory "/usr".
|
||||
+auto-load: Using directory "/opt".
|
||||
+warning: File "/tmp/true-gdb.gdb" auto-loading has been declined
|
||||
+ by your `auto-load safe-path' set to "/usr:/opt".
|
||||
+@end smallexample
|
||||
+
|
||||
+@table @code
|
||||
+@anchor{set debug auto-load}
|
||||
+@kindex set debug auto-load
|
||||
+@item set debug auto-load [on|off]
|
||||
+Set whether to print the filenames attempted to be auto-loaded.
|
||||
+
|
||||
+@anchor{show debug auto-load}
|
||||
+@kindex show debug auto-load
|
||||
+@item show debug auto-load
|
||||
+Show whether printing of the filenames attempted to be auto-loaded is turned
|
||||
+on or off.
|
||||
+@end table
|
||||
+
|
||||
@node Messages/Warnings
|
||||
@section Optional Warnings and Messages
|
||||
|
||||
Index: gdb-7.3.1/gdb/python/py-auto-load.c
|
||||
===================================================================
|
||||
--- gdb-7.3.1.orig/gdb/python/py-auto-load.c 2012-04-20 23:05:22.000000000 +0200
|
||||
+++ gdb-7.3.1/gdb/python/py-auto-load.c 2012-04-20 23:07:15.706746707 +0200
|
||||
@@ -75,7 +75,10 @@ gdbpy_load_auto_script_for_objfile (stru
|
||||
int is_safe;
|
||||
struct auto_load_pspace_info *pspace_info;
|
||||
|
||||
- is_safe = file_is_auto_load_safe (filename);
|
||||
+ is_safe = file_is_auto_load_safe (filename,
|
||||
+ _("auto-load: Loading Python script \"%s\" "
|
||||
+ "by extension for objfile \"%s\".\n"),
|
||||
+ filename, objfile->name);
|
||||
|
||||
/* Add this script to the hash table too so "info auto-load python-scripts"
|
||||
can print it. */
|
||||
@@ -153,7 +156,12 @@ source_section_scripts (struct objfile *
|
||||
make_cleanup_fclose (stream);
|
||||
make_cleanup (xfree, full_path);
|
||||
|
||||
- if (!file_is_auto_load_safe (full_path))
|
||||
+ if (!file_is_auto_load_safe (full_path,
|
||||
+ _("auto-load: Loading Python script "
|
||||
+ "\"%s\" from section \"%s\" of "
|
||||
+ "objfile \"%s\".\n"),
|
||||
+ full_path, GDBPY_AUTO_SECTION_NAME,
|
||||
+ objfile->name))
|
||||
opened = 0;
|
||||
}
|
||||
else
|
52
gdb.spec
52
gdb.spec
|
@ -27,7 +27,7 @@ Version: 7.3.1
|
|||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
Release: 48%{?_with_upstream:.upstream}%{?dist}
|
||||
Release: 49%{?_with_upstream:.upstream}%{?dist}
|
||||
|
||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
|
||||
Group: Development/Debuggers
|
||||
|
@ -172,10 +172,6 @@ Patch145: gdb-6.3-threaded-watchpoints2-20050225.patch
|
|||
#=ia64
|
||||
Patch153: gdb-6.3-ia64-gcore-page0-20050421.patch
|
||||
|
||||
# Security errata for untrusted .gdbinit
|
||||
#=push
|
||||
Patch157: gdb-6.3-security-errata-20050610.patch
|
||||
|
||||
# IA64 sigtramp prev register patch
|
||||
#=ia64
|
||||
Patch158: gdb-6.3-ia64-sigtramp-frame-20050708.patch
|
||||
|
@ -586,6 +582,28 @@ Patch636: gdb-anon-namespace-crash.patch
|
|||
# [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715).
|
||||
Patch637: gdb-pretty-printer-crash.patch
|
||||
|
||||
# Security fix for loading untrusted inferiors, see "set auto-load" (BZ 756117).
|
||||
#=push
|
||||
Patch662: gdb-autoload-01of19.patch
|
||||
Patch663: gdb-autoload-02of19.patch
|
||||
Patch664: gdb-autoload-03of19.patch
|
||||
Patch665: gdb-autoload-04of19.patch
|
||||
Patch666: gdb-autoload-05of19.patch
|
||||
Patch667: gdb-autoload-06of19.patch
|
||||
Patch668: gdb-autoload-07of19.patch
|
||||
Patch669: gdb-autoload-08of19.patch
|
||||
Patch670: gdb-autoload-09of19.patch
|
||||
Patch671: gdb-autoload-10of19.patch
|
||||
Patch672: gdb-autoload-11of19.patch
|
||||
Patch673: gdb-autoload-12of19.patch
|
||||
Patch674: gdb-autoload-13of19.patch
|
||||
Patch675: gdb-autoload-14of19.patch
|
||||
Patch676: gdb-autoload-15of19.patch
|
||||
Patch677: gdb-autoload-16of19.patch
|
||||
Patch678: gdb-autoload-17of19.patch
|
||||
Patch679: gdb-autoload-18of19.patch
|
||||
Patch680: gdb-autoload-19of19.patch
|
||||
|
||||
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
|
||||
# --without-system-readline
|
||||
# Requires: readline%{?_isa}
|
||||
|
@ -762,7 +780,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||
%patch259 -p1
|
||||
%patch145 -p1
|
||||
%patch153 -p1
|
||||
%patch157 -p1
|
||||
%patch158 -p1
|
||||
%patch160 -p1
|
||||
%patch161 -p1
|
||||
|
@ -870,6 +887,25 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||
%patch635 -p1
|
||||
%patch636 -p1
|
||||
%patch637 -p1
|
||||
%patch662 -p1
|
||||
%patch663 -p1
|
||||
%patch664 -p1
|
||||
%patch665 -p1
|
||||
%patch666 -p1
|
||||
%patch667 -p1
|
||||
%patch668 -p1
|
||||
%patch669 -p1
|
||||
%patch670 -p1
|
||||
%patch671 -p1
|
||||
%patch672 -p1
|
||||
%patch673 -p1
|
||||
%patch674 -p1
|
||||
%patch675 -p1
|
||||
%patch676 -p1
|
||||
%patch677 -p1
|
||||
%patch678 -p1
|
||||
%patch679 -p1
|
||||
%patch680 -p1
|
||||
|
||||
%patch393 -p1
|
||||
%patch335 -p1
|
||||
|
@ -983,6 +1019,7 @@ $(: RHEL-5 librpm has incompatible API. ) \
|
|||
%if 0%{?_with_debug:1}
|
||||
--enable-static --disable-shared --enable-debug \
|
||||
%endif
|
||||
--with-auto-load-safe-path=%{_root_prefix}:/bin:/sbin:/lib:/lib64 \
|
||||
%ifarch sparc sparcv9
|
||||
sparc-%{_vendor}-%{_target_os}%{?_gnu}
|
||||
%else
|
||||
|
@ -1292,6 +1329,9 @@ fi
|
|||
%{_infodir}/gdb.info*
|
||||
|
||||
%changelog
|
||||
* Sat Apr 21 2012 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.3.1-49.fc15
|
||||
- Security fix for loading untrusted inferiors, see "set auto-load" (BZ 756117).
|
||||
|
||||
* Sat Mar 17 2012 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.3.1-48.fc15
|
||||
- Fix loading of core files without build-ids but with build-ids in executables.
|
||||
|
||||
|
|
Loading…
Reference in New Issue