mirror of
https://github.com/expo/bsdiff.git
synced 2026-11-14 17:49:03 -10:00
Fix infinite loop when using extents.
Clearing |buffer_| still actually makes sense because MemoryFile::Close()
is called twice: once explicitly from bspatch to check if Close()
succeeded, once from destructor to ensure that everything is closed. And
if we don't clear |buffer_|, on the second Close(), it will try to write
|buffer_| to |file_| again, and if |file_| is an ExtentsFile, it will
simply return true and set |bytes_written| to 0 on Write() because all
the extents are already written, now WriteAll() became an infinite
loop.
Although returning false if written is 0 in WriteAll() will fix this, but
I think we should not write the same buffer again in the first place.
Test: call bspatch with extents
Bug: 28345972
Change-Id: If3bddcc6e8ca6751c422c066e5b8b02f91086ed5
(cherry picked from commit b14bb55294)
This commit is contained in:
1 parent
79ffca0eec
commit
b70ee14103
2 files changed
+4
-1
No files matched your search
+1
-1
@@ -112,7 +112,7 @@ bool WriteAll(const std::unique_ptr<FileInterface>& file,
|
||||
size_t size) {
|
||||
size_t offset = 0, written;
|
||||
while (offset < size) {
|
||||
if (!file->Write(data + offset, size - offset, &written))
|
||||
if (!file->Write(data + offset, size - offset, &written) || written == 0)
|
||||
return false;
|
||||
offset += written;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,9 @@ bool MemoryFile::Seek(off_t pos) {
|
||||
bool MemoryFile::Close() {
|
||||
if (!WriteAll(file_, buffer_.data(), buffer_.size()))
|
||||
return false;
|
||||
// Prevent writing |buffer_| to |file_| again if Close() is called more than
|
||||
// once.
|
||||
buffer_.clear();
|
||||
return file_->Close();
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user