From 92ceba1e4f12b335f6161d08a52c62a9c7954fe0 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 14 Apr 2005 02:27:56 +0000 Subject: [PATCH] * merge.c (sec_merge_emit): Tidy. Check for bfd_zmalloc errors. Write trailing padding. --- bfd/ChangeLog | 3 +++ bfd/merge.c | 35 ++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6e660489399..cd93c381324 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,8 @@ 2005-04-14 Alan Modra + * merge.c (sec_merge_emit): Tidy. Check for bfd_zmalloc errors. + Write trailing padding. + * merge.c (merge_strings): Round up section size for alignment. 2005-04-14 David S. Miller 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. -- 2.30.2