diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-04-20 13:04:30 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-04-20 13:04:30 +0000 |
commit | 4ba9af11417c45abc063c9906c7e593b85fccc17 (patch) | |
tree | 74c9c3c8863fad2220549977653461c7e5eddc9f /llvm/lib/Support/raw_ostream.cpp | |
parent | 5de4a6c0af0df9f5ae5f9614d2a5fd0f17c597b8 (diff) | |
download | bcm5719-llvm-4ba9af11417c45abc063c9906c7e593b85fccc17.tar.gz bcm5719-llvm-4ba9af11417c45abc063c9906c7e593b85fccc17.zip |
Don't allow pwrite to resize a stream.
The current implementations could exhibit some behavior differences:
raw_fd_ostream: Whatever the underlying fd does with seek+write. In a normal
file, the write position would be back to the old offset.
raw_svector_ostream: The write position is always the end of the stream, so
after pwrite the write position would be the new end. This matches what OS_X
(all BSD?) do with a pwrite in a O_APPEND fd.
Given that we don't need that feature and don't use O_APPEND a lot in LLVM,
just disallow it.
I am open to suggestions on renaming pwrite to something else, but this fixes
the issue for now.
Thanks to Yaron Keren for reporting it.
llvm-svn: 235303
Diffstat (limited to 'llvm/lib/Support/raw_ostream.cpp')
-rw-r--r-- | llvm/lib/Support/raw_ostream.cpp | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp index 6f9f910cad9..4c0b6c7b563 100644 --- a/llvm/lib/Support/raw_ostream.cpp +++ b/llvm/lib/Support/raw_ostream.cpp @@ -630,7 +630,8 @@ uint64_t raw_fd_ostream::seek(uint64_t off) { return pos; } -void raw_fd_ostream::pwrite(const char *Ptr, size_t Size, uint64_t Offset) { +void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size, + uint64_t Offset) { uint64_t Pos = tell(); seek(Offset); write(Ptr, Size); @@ -781,14 +782,9 @@ raw_svector_ostream::~raw_svector_ostream() { flush(); } -void raw_svector_ostream::pwrite(const char *Ptr, size_t Size, - uint64_t Offset) { +void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size, + uint64_t Offset) { flush(); - - uint64_t End = Offset + Size; - if (End > OS.size()) - OS.resize(End); - memcpy(OS.begin() + Offset, Ptr, Size); } @@ -847,4 +843,5 @@ uint64_t raw_null_ostream::current_pos() const { return 0; } -void raw_null_ostream::pwrite(const char *Ptr, size_t Size, uint64_t Offset) {} +void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size, + uint64_t Offset) {} |