diff options
| author | Maxime Coste <mawww@kakoune.org> | 2019-05-29 20:28:06 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2019-05-29 20:28:06 +1000 |
| commit | 262ef9b4e3d8bcd9252603778a12a3900024f23c (patch) | |
| tree | 2454d3ab0e0e45f0c0886b99395d136d9ccbe56a /src/file.cc | |
| parent | 7de3ea786ff87daa9d554c7390dc066516758ab7 (diff) | |
Fix BufferedWriter triggering std::terminate on exception when writing
Fixes #2932
Diffstat (limited to 'src/file.cc')
| -rw-r--r-- | src/file.cc | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/file.cc b/src/file.cc index 36d354e6..1bcbd756 100644 --- a/src/file.cc +++ b/src/file.cc @@ -273,12 +273,13 @@ void write_to_file(StringView filename, StringView data) struct BufferedWriter { - BufferedWriter(int fd) : fd{fd} {} + BufferedWriter(int fd) + : m_fd{fd}, m_exception_count{std::uncaught_exceptions()} {} - ~BufferedWriter() + ~BufferedWriter() noexcept(false) { - if (pos != 0) - Kakoune::write(fd, {buffer, pos}); + if (m_pos != 0 and m_exception_count == std::uncaught_exceptions()) + Kakoune::write(m_fd, {m_buffer, m_pos}); } void write(StringView data) @@ -286,13 +287,13 @@ struct BufferedWriter while (not data.empty()) { const ByteCount length = data.length(); - const ByteCount write_len = std::min(length, size - pos); - memcpy(buffer + (int)pos, data.data(), (int)write_len); - pos += write_len; - if (pos == size) + const ByteCount write_len = std::min(length, size - m_pos); + memcpy(m_buffer + (int)m_pos, data.data(), (int)write_len); + m_pos += write_len; + if (m_pos == size) { - Kakoune::write(fd, {buffer, size}); - pos = 0; + Kakoune::write(m_fd, {m_buffer, size}); + m_pos = 0; } data = data.substr(write_len); } @@ -300,9 +301,10 @@ struct BufferedWriter private: static constexpr ByteCount size = 4096; - int fd; - ByteCount pos = 0; - char buffer[(int)size]; + int m_fd; + int m_exception_count; + ByteCount m_pos = 0; + char m_buffer[(int)size]; }; |
