Index: bfd/opncls.c |
diff --git a/bfd/opncls.c b/bfd/opncls.c |
index 9d33f3974fb0b3f214a14272463092f0a61e9860..7c1d2f99a5815990d97da36958079a91e8538946 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 <<NULL>> is returned then an error has occured. Possible errors |
are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or |
<<system_call>> 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 <<bfd_error_no_memory>>, |
<<bfd_error_invalid_target>> and <<bfd_error_system_call>>. |
+ |
+ 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; |
} |