aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/bfdwin.c2
-rw-r--r--bfd/cache.c46
-rw-r--r--bfd/hppabsd-core.c2
-rw-r--r--bfd/sco5-core.c2
-rw-r--r--bfd/trad-core.c2
6 files changed, 54 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 01987b1..64440a4 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,17 @@
2005-10-26 Alan Modra <amodra@bigpond.net.au>
+ * cache.c (bfd_cache_lookup_worker): Don't abort on failing to
+ reopen file.
+ (cache_btell, cache_bseek, cache_bflush, cache_bstat): Return -1 on
+ bfd_cache_lookup failure.
+ (cache_bread, cache_bwrite): Return 0 on the same.
+ * bfdwin.c (bfd_get_file_window): Likewise.
+ * hppabsd-core.c (hppabsd_core_core_file_p): Likewise.
+ * sco5-core.c (sco5_core_file_p): Likewise.
+ * trad-core.c (trad_unix_core_file_p): Likewise.
+
+2005-10-26 Alan Modra <amodra@bigpond.net.au>
+
* cache.c (bfd_cache_lookup_worker): Use bfd_error_handler
rather than bfd_perror. Print file name. Internationalise.
diff --git a/bfd/bfdwin.c b/bfd/bfdwin.c
index d3e4ba8..1450ab0 100644
--- a/bfd/bfdwin.c
+++ b/bfd/bfdwin.c
@@ -153,6 +153,8 @@ bfd_get_file_window (bfd *abfd,
abfd = abfd->my_archive;
}
f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return FALSE;
fd = fileno (f);
/* Compute offsets and size for mmap and for the user's data. */
diff --git a/bfd/cache.c b/bfd/cache.c
index 88d0c98..13f4a07 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -51,13 +51,19 @@ static bfd_boolean bfd_cache_delete (bfd *);
static file_ptr
cache_btell (struct bfd *abfd)
{
- return real_ftell (bfd_cache_lookup (abfd));
+ FILE *f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return -1;
+ return real_ftell (f);
}
static int
cache_bseek (struct bfd *abfd, file_ptr offset, int whence)
{
- return real_fseek (bfd_cache_lookup (abfd), offset, whence);
+ FILE *f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return -1;
+ return real_fseek (f, offset, whence);
}
/* Note that archive entries don't have streams; they share their parent's.
@@ -70,6 +76,7 @@ cache_bseek (struct bfd *abfd, file_ptr offset, int whence)
static file_ptr
cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
{
+ FILE *f;
file_ptr nread;
/* FIXME - this looks like an optimization, but it's really to cover
up for a feature of some OSs (not solaris - sigh) that
@@ -83,10 +90,14 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
if (nbytes == 0)
return 0;
+ f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return 0;
+
#if defined (__VAX) && defined (VMS)
/* Apparently fread on Vax VMS does not keep the record length
information. */
- nread = read (fileno (bfd_cache_lookup (abfd)), buf, nbytes);
+ nread = read (fileno (f), buf, nbytes);
/* Set bfd_error if we did not read as much data as we expected. If
the read failed due to an error set the bfd_error_system_call,
else set bfd_error_file_truncated. */
@@ -96,11 +107,11 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
return -1;
}
#else
- nread = fread (buf, 1, nbytes, bfd_cache_lookup (abfd));
+ nread = fread (buf, 1, nbytes, f);
/* Set bfd_error if we did not read as much data as we expected. If
the read failed due to an error set the bfd_error_system_call,
else set bfd_error_file_truncated. */
- if (nread < nbytes && ferror (bfd_cache_lookup (abfd)))
+ if (nread < nbytes && ferror (f))
{
bfd_set_error (bfd_error_system_call);
return -1;
@@ -112,8 +123,12 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
static file_ptr
cache_bwrite (struct bfd *abfd, const void *where, file_ptr nbytes)
{
- file_ptr nwrite = fwrite (where, 1, nbytes, bfd_cache_lookup (abfd));
- if (nwrite < nbytes && ferror (bfd_cache_lookup (abfd)))
+ file_ptr nwrite;
+ FILE *f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return 0;
+ nwrite = fwrite (where, 1, nbytes, f);
+ if (nwrite < nbytes && ferror (f))
{
bfd_set_error (bfd_error_system_call);
return -1;
@@ -130,7 +145,11 @@ cache_bclose (struct bfd *abfd)
static int
cache_bflush (struct bfd *abfd)
{
- int sts = fflush (bfd_cache_lookup (abfd));
+ int sts;
+ FILE *f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return -1;
+ sts = fflush (f);
if (sts < 0)
bfd_set_error (bfd_error_system_call);
return sts;
@@ -139,7 +158,11 @@ cache_bflush (struct bfd *abfd)
static int
cache_bstat (struct bfd *abfd, struct stat *sb)
{
- int sts = fstat (fileno (bfd_cache_lookup (abfd)), sb);
+ int sts;
+ FILE *f = bfd_cache_lookup (abfd);
+ if (f == NULL)
+ return -1;
+ sts = fstat (fileno (f), sb);
if (sts < 0)
bfd_set_error (bfd_error_system_call);
return sts;
@@ -470,8 +493,8 @@ DESCRIPTION
quick answer. Find a file descriptor for @var{abfd}. If
necessary, it open it. If there are already more than
<<BFD_CACHE_MAX_OPEN>> files open, it tries to close one first, to
- avoid running out of file descriptors. It will abort rather than
- returning NULL if it is unable to (re)open the @var{abfd}.
+ avoid running out of file descriptors. It will return NULL
+ if it is unable to (re)open the @var{abfd}.
*/
FILE *
@@ -504,6 +527,5 @@ bfd_cache_lookup_worker (bfd *abfd)
(*_bfd_error_handler) (_("reopening %B: %s\n"),
orig_bfd, bfd_errmsg (bfd_get_error ()));
- abort ();
return NULL;
}
diff --git a/bfd/hppabsd-core.c b/bfd/hppabsd-core.c
index 2ad2735..b17acc6 100644
--- a/bfd/hppabsd-core.c
+++ b/bfd/hppabsd-core.c
@@ -140,6 +140,8 @@ hppabsd_core_core_file_p (abfd)
FILE *stream = bfd_cache_lookup (abfd);
struct stat statbuf;
+ if (stream == NULL)
+ return NULL;
if (fstat (fileno (stream), &statbuf) < 0)
{
bfd_set_error (bfd_error_system_call);
diff --git a/bfd/sco5-core.c b/bfd/sco5-core.c
index e9b5159..e85c4d3 100644
--- a/bfd/sco5-core.c
+++ b/bfd/sco5-core.c
@@ -129,6 +129,8 @@ sco5_core_file_p (abfd)
FILE *stream = bfd_cache_lookup (abfd);
struct stat statbuf;
+ if (stream == NULL)
+ return NULL;
if (fstat (fileno (stream), &statbuf) < 0)
{
bfd_set_error (bfd_error_system_call);
diff --git a/bfd/trad-core.c b/bfd/trad-core.c
index defad69..c958683 100644
--- a/bfd/trad-core.c
+++ b/bfd/trad-core.c
@@ -112,6 +112,8 @@ trad_unix_core_file_p (abfd)
FILE *stream = bfd_cache_lookup (abfd);
struct stat statbuf;
+ if (stream == NULL)
+ return 0;
if (fstat (fileno (stream), &statbuf) < 0)
{
bfd_set_error (bfd_error_system_call);