diff options
-rw-r--r-- | gold/ChangeLog | 6 | ||||
-rw-r--r-- | gold/output.cc | 12 |
2 files changed, 15 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 1833996..61ad6cd 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2011-10-18 Cary Coutant <ccoutant@google.com> + + * output.cc (posix_fallocate): Return 0 on success, errno on failure. + (Output_file::map_no_anonymous): Check for non-zero + return code from posix_fallocate. + 2011-10-17 Cary Coutant <ccoutant@google.com> PR gold/13245 diff --git a/gold/output.cc b/gold/output.cc index 7b272e8..7633c73 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -119,7 +119,9 @@ extern "C" void *gold_mremap(void *, size_t, size_t, int); static int posix_fallocate(int o, off_t offset, off_t len) { - return ftruncate(o, offset + len); + if (ftruncate(o, offset + len) < 0) + return errno; + return 0; } #endif // !defined(HAVE_POSIX_FALLOCATE) @@ -5075,8 +5077,12 @@ Output_file::map_no_anonymous(bool writable) // output file will wind up incomplete, but we will have already // exited. The alternative to fallocate would be to use fdatasync, // but that would be a more significant performance hit. - if (writable && ::posix_fallocate(o, 0, this->file_size_) < 0) - gold_fatal(_("%s: %s"), this->name_, strerror(errno)); + if (writable) + { + int err = ::posix_fallocate(o, 0, this->file_size_); + if (err != 0) + gold_fatal(_("%s: %s"), this->name_, strerror(err)); + } // Map the file into memory. int prot = PROT_READ; |