diff options
author | DJ Delorie <dj@redhat.com> | 2000-07-12 18:29:55 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2000-07-12 18:29:55 +0000 |
commit | e67f03db5baec45164b177cc6396b367fa6b15ff (patch) | |
tree | 0fe10ec7efbf9acd17768652f1bb14b39e4cf5da /bfd/libbfd.c | |
parent | 7f7888218f38ff55bb5a4879e2cc4bd3bdaf7f51 (diff) | |
download | binutils-e67f03db5baec45164b177cc6396b367fa6b15ff.tar.gz binutils-e67f03db5baec45164b177cc6396b367fa6b15ff.tar.bz2 binutils-e67f03db5baec45164b177cc6396b367fa6b15ff.zip |
* libbfd.c (bfd_seek): fix 'seek beyond EOF' error when writing
out a structure that is BFD_IN_MEMORY.
Diffstat (limited to 'bfd/libbfd.c')
-rw-r--r-- | bfd/libbfd.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/bfd/libbfd.c b/bfd/libbfd.c index 1bc0f33ee12..2e9c6c2d204 100644 --- a/bfd/libbfd.c +++ b/bfd/libbfd.c @@ -691,11 +691,31 @@ bfd_seek (abfd, position, direction) if ((bfd_size_type) abfd->where > bim->size) { - abfd->where = bim->size; - bfd_set_error (bfd_error_file_truncated); - return -1; - } - + if ((abfd->direction == write_direction) || + (abfd->direction == both_direction)) + { + long newsize, oldsize = (bim->size + 127) & ~127; + bim->size = abfd->where; + /* Round up to cut down on memory fragmentation */ + newsize = (bim->size + 127) & ~127; + if (newsize > oldsize) + { + bim->buffer = bfd_realloc (bim->buffer, newsize); + if (bim->buffer == 0) + { + bim->size = 0; + bfd_set_error (bfd_error_no_memory); + return -1; + } + } + } + else + { + abfd->where = bim->size; + bfd_set_error (bfd_error_file_truncated); + return -1; + } + } return 0; } |