This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFA: cleanups -vs- gdb_fopen
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 28 Oct 2008 12:16:24 -0600
- Subject: RFA: cleanups -vs- gdb_fopen
- Reply-to: tromey at redhat dot com
This patch changes a few gdb_fopen leaks to use cleanups. This is
similar to yesterday's patch for fopen. Basically, there are some
situations where an error could leave an open file descriptor.
In some of these cases, a cleanup might not strictly be required.
Some of the guarded code can only call internal_error, not error.
However, I think it is safer to use cleanups, because it means the
caller is protected against changes in any callee.
Built & regtested on x86-64 (compile farm).
Ok?
Tom
2008-10-28 Tom Tromey <tromey@redhat.com>
* cli/cli-logging.c (handle_redirections): Make a cleanup.
* reggroups.c (maintenance_print_reggroups): Make a cleanup.
* regcache.c (regcache_print): Make a cleanup.
* maint.c (maintenance_print_architecture): Make a cleanup.
* dummy-frame.c (maintenance_print_dummy_frames): Make a cleanup.
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
index 86f1bc0..5f1bcb8 100644
--- a/gdb/cli/cli-logging.c
+++ b/gdb/cli/cli-logging.c
@@ -85,6 +85,7 @@ pop_output_files (void)
static void
handle_redirections (int from_tty)
{
+ struct cleanup *cleanups;
struct ui_file *output;
if (saved_filename != NULL)
@@ -97,6 +98,7 @@ handle_redirections (int from_tty)
output = gdb_fopen (logging_filename, logging_overwrite ? "w" : "a");
if (output == NULL)
perror_with_name (_("set logging"));
+ cleanups = make_cleanup_ui_file_delete (output);
/* Redirects everything to gdb_stdout while this is running. */
if (!logging_redirect)
@@ -112,6 +114,8 @@ handle_redirections (int from_tty)
fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n",
logging_filename);
+ discard_cleanups (cleanups);
+
saved_filename = xstrdup (logging_filename);
saved_output.out = gdb_stdout;
saved_output.err = gdb_stderr;
diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c
index a27de2e..9cc3da7 100644
--- a/gdb/dummy-frame.c
+++ b/gdb/dummy-frame.c
@@ -265,11 +265,13 @@ maintenance_print_dummy_frames (char *args, int from_tty)
fprint_dummy_frames (gdb_stdout);
else
{
+ struct cleanup *cleanups;
struct ui_file *file = gdb_fopen (args, "w");
if (file == NULL)
perror_with_name (_("maintenance print dummy-frames"));
+ cleanups = make_cleanup_ui_file_delete (file);
fprint_dummy_frames (file);
- ui_file_delete (file);
+ do_cleanups (cleanups);
}
}
diff --git a/gdb/maint.c b/gdb/maint.c
index e64d4fe..365e374 100644
--- a/gdb/maint.c
+++ b/gdb/maint.c
@@ -414,11 +414,13 @@ maintenance_print_architecture (char *args, int from_tty)
gdbarch_dump (current_gdbarch, gdb_stdout);
else
{
+ struct cleanup *cleanups;
struct ui_file *file = gdb_fopen (args, "w");
if (file == NULL)
perror_with_name (_("maintenance print architecture"));
+ cleanups = make_cleanup_ui_file_delete (file);
gdbarch_dump (current_gdbarch, file);
- ui_file_delete (file);
+ do_cleanups (cleanups);
}
}
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 616a6f7..74ca6f0 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1104,11 +1104,13 @@ regcache_print (char *args, enum regcache_dump_what what_to_dump)
regcache_dump (get_current_regcache (), gdb_stdout, what_to_dump);
else
{
+ struct cleanup *cleanups;
struct ui_file *file = gdb_fopen (args, "w");
if (file == NULL)
perror_with_name (_("maintenance print architecture"));
+ cleanups = make_cleanup_ui_file_delete (file);
regcache_dump (get_current_regcache (), file, what_to_dump);
- ui_file_delete (file);
+ do_cleanups (cleanups);
}
}
diff --git a/gdb/reggroups.c b/gdb/reggroups.c
index ea2451e..a4e1d31 100644
--- a/gdb/reggroups.c
+++ b/gdb/reggroups.c
@@ -234,11 +234,13 @@ maintenance_print_reggroups (char *args, int from_tty)
reggroups_dump (current_gdbarch, gdb_stdout);
else
{
+ struct cleanup *cleanups;
struct ui_file *file = gdb_fopen (args, "w");
if (file == NULL)
perror_with_name (_("maintenance print reggroups"));
+ cleanups = make_cleanup_ui_file_delete (file);
reggroups_dump (current_gdbarch, file);
- ui_file_delete (file);
+ do_cleanups (cleanups);
}
}