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 | 20c73575eb7f9589c17155957a7ac271dcc35b74 (patch) | |
tree | 64a6c2338a923b4c8eb248e9762cb0bb998ac981 /bfd/merge.c | |
parent | ec047500404a787b7279d77ead267a7004bad4fe (diff) | |
download | gdb-20c73575eb7f9589c17155957a7ac271dcc35b74.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 da826c7175e..ccbf5b7e968 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. |