* libbfd.c (bfd_seek): fix 'seek beyond EOF' error when writing
authorDJ Delorie <dj@redhat.com>
Wed, 12 Jul 2000 18:29:55 +0000 (18:29 +0000)
committerDJ Delorie <dj@redhat.com>
Wed, 12 Jul 2000 18:29:55 +0000 (18:29 +0000)
out a structure that is BFD_IN_MEMORY.

bfd/ChangeLog
bfd/libbfd.c

index ec8caa5..073556f 100644 (file)
@@ -1,3 +1,8 @@
+2000-07-12  Charles Wilson  <cwilson@ece.gatech.edu>
+
+       * libbfd.c (bfd_seek): fix 'seek beyond EOF' error when writing
+       out a structure that is BFD_IN_MEMORY.
+
 2000-07-11  Alan Modra  <alan@linuxcare.com.au>
 
        * elf64-hppa.c (get_dyn_name): Pass in section pointer instead of
index 1bc0f33..2e9c6c2 100644 (file)
@@ -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;
     }