diff options
author | Alan Modra <amodra@bigpond.net.au> | 2005-04-14 02:27:56 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2005-04-14 02:27:56 +0000 |
commit | fc491c7433f60e1bc22465b881cbc958a4b213db (patch) | |
tree | 30ec975d1e560a9f08f1830496bc61dabc7c39c4 /bfd/merge.c | |
parent | ff70f729920e9abd1e8351ea9d2f0383823ac621 (diff) | |
download | binutils-redhat-fc491c7433f60e1bc22465b881cbc958a4b213db.tar.gz |
* merge.c (sec_merge_emit): Tidy. Check for bfd_zmalloc errors.
Write trailing padding.
Diffstat (limited to 'bfd/merge.c')
-rw-r--r-- | bfd/merge.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/bfd/merge.c b/bfd/merge.c index da826c7175..ccbf5b7e96 100644 --- a/bfd/merge.c +++ b/bfd/merge.c @@ -288,24 +288,27 @@ sec_merge_emit (bfd *abfd, struct sec_merge_hash_entry *entry) { struct sec_merge_sec_info *secinfo = entry->secinfo; asection *sec = secinfo->sec; - char *pad = ""; + char *pad = NULL; bfd_size_type off = 0; int alignment_power = sec->output_section->alignment_power; if (alignment_power) - pad = bfd_zmalloc ((bfd_size_type) 1 << alignment_power); + { + pad = bfd_zmalloc ((bfd_size_type) 1 << alignment_power); + if (pad == NULL) + return FALSE; + } for (; entry != NULL && entry->secinfo == secinfo; entry = entry->next) { - register const char *str; - register size_t len; + const char *str; + bfd_size_type len; - len = off & (entry->alignment - 1); - if (len) + len = -off & (entry->alignment - 1); + if (len != 0) { - len = entry->alignment - len; if (bfd_bwrite (pad, len, abfd) != len) - break; + goto err; off += len; } @@ -313,15 +316,25 @@ sec_merge_emit (bfd *abfd, struct sec_merge_hash_entry *entry) len = entry->len; if (bfd_bwrite (str, len, abfd) != len) - break; + goto err; off += len; } - if (alignment_power) + /* Trailing alignment needed? */ + off = sec->size - off; + if (off != 0 + && bfd_bwrite (pad, off, abfd) != off) + goto err; + + if (pad != NULL) free (pad); + return TRUE; - return entry == NULL || entry->secinfo != secinfo; + err: + if (pad != NULL) + free (pad); + return FALSE; } /* Register a SEC_MERGE section as a candidate for merging. |