summaryrefslogtreecommitdiff
path: root/bfd/merge.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2005-04-14 02:27:56 +0000
committerAlan Modra <amodra@bigpond.net.au>2005-04-14 02:27:56 +0000
commitfc491c7433f60e1bc22465b881cbc958a4b213db (patch)
tree30ec975d1e560a9f08f1830496bc61dabc7c39c4 /bfd/merge.c
parentff70f729920e9abd1e8351ea9d2f0383823ac621 (diff)
downloadbinutils-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.c35
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.