From 6f0c7050fcfb9db9096f2f988f1104eba427bd6c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 29 May 2012 14:23:40 +0000 Subject: [PATCH] bfd/ * opncls.c (bfd_fopen): Always close fd on failure. (bfd_fdopenr): Likewise. gdb/ * symfile.c (symfile_bfd_open): Don't close desc if bfd_fopen fails. * solib.c (solib_bfd_fopen): Don't close fd if bfd_fopen fails. * exec.c (exec_file_attach): Don't close scratch_chan if bfd_fopen fails. * dwarf2read.c (try_open_dwo_file): Don't close fd if bfd_fopen fails. --- bfd/ChangeLog | 5 +++++ bfd/opncls.c | 18 ++++++++++++++++-- gdb/ChangeLog | 10 ++++++++++ gdb/dwarf2read.c | 1 - gdb/exec.c | 1 - gdb/solib.c | 2 -- gdb/symfile.c | 1 - 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4abe5f287f..90f24bcb03 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2012-05-29 Tom Tromey + + * opncls.c (bfd_fopen): Always close fd on failure. + (bfd_fdopenr): Likewise. + 2012-05-27 Alan Modra PR ld/14170 diff --git a/bfd/opncls.c b/bfd/opncls.c index 9d33f3974f..7c1d2f99a5 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -1,6 +1,6 @@ /* opncls.c -- open and close a BFD. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. Written by Cygnus Support. @@ -190,6 +190,8 @@ DESCRIPTION If <> is returned then an error has occured. Possible errors are <>, <> or <> error. + + On error, @var{fd} is always closed. */ bfd * @@ -200,11 +202,17 @@ bfd_fopen (const char *filename, const char *target, const char *mode, int fd) nbfd = _bfd_new_bfd (); if (nbfd == NULL) - return NULL; + { + if (fd != -1) + close (fd); + return NULL; + } target_vec = bfd_find_target (target, nbfd); if (target_vec == NULL) { + if (fd != -1) + close (fd); _bfd_delete_bfd (nbfd); return NULL; } @@ -307,6 +315,8 @@ DESCRIPTION Possible errors are <>, <> and <>. + + On error, @var{fd} is closed. */ bfd * @@ -323,6 +333,10 @@ bfd_fdopenr (const char *filename, const char *target, int fd) fdflags = fcntl (fd, F_GETFL, NULL); if (fdflags == -1) { + int save = errno; + + close (fd); + errno = save; bfd_set_error (bfd_error_system_call); return NULL; } diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7677154f43..c089f038f8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2012-05-29 Tom Tromey + + * symfile.c (symfile_bfd_open): Don't close desc if bfd_fopen + fails. + * solib.c (solib_bfd_fopen): Don't close fd if bfd_fopen fails. + * exec.c (exec_file_attach): Don't close scratch_chan if bfd_fopen + fails. + * dwarf2read.c (try_open_dwo_file): Don't close fd if bfd_fopen + fails. + 2012-05-29 Tristan Gingold * solib-darwin.c (dyld_all_image_addr, dyld_all_image): Move into... diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 53100c519b..8dbc53e911 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -6957,7 +6957,6 @@ try_open_dwo_file (const char *file_name) sym_bfd = bfd_fopen (absolute_name, gnutarget, FOPEN_RB, desc); if (!sym_bfd) { - close (desc); xfree (absolute_name); return NULL; } diff --git a/gdb/exec.c b/gdb/exec.c index 58fb55e2bf..6ba198615f 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -238,7 +238,6 @@ exec_file_attach (char *filename, int from_tty) if (!exec_bfd) { - close (scratch_chan); error (_("\"%s\": could not open as an executable file: %s"), scratch_pathname, bfd_errmsg (bfd_get_error ())); } diff --git a/gdb/solib.c b/gdb/solib.c index 656e8dfa55..90439ba584 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -380,8 +380,6 @@ solib_bfd_fopen (char *pathname, int fd) if (abfd) bfd_set_cacheable (abfd, 1); - else if (fd != -1) - close (fd); } if (!abfd) diff --git a/gdb/symfile.c b/gdb/symfile.c index 416d35d13c..31da4e4842 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1764,7 +1764,6 @@ symfile_bfd_open (char *name) sym_bfd = bfd_fopen (name, gnutarget, FOPEN_RB, desc); if (!sym_bfd) { - close (desc); make_cleanup (xfree, name); error (_("`%s': can't open to read symbols: %s."), name, bfd_errmsg (bfd_get_error ())); -- 2.34.1