summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2017-04-28 20:52:38 +0200
committerandroid-build-merger <android-build-merger@google.com>2017-04-28 20:52:38 +0200
commit9b158bc9a3ada67e8a5b877f14954d361bdfca80 (patch)
tree33bd9a62540777dda99983461fcb3d78003abc97
parentAdding support for quiescent reboot to recovery am: ed9db0fd73 (diff)
parentMerge "Fix potential OOM in update_verifier" am: 5443072c3c am: 00a309ab3e (diff)
downloadandroid_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.tar
android_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.tar.gz
android_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.tar.bz2
android_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.tar.lz
android_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.tar.xz
android_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.tar.zst
android_bootable_recovery-9b158bc9a3ada67e8a5b877f14954d361bdfca80.zip
-rw-r--r--update_verifier/update_verifier.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/update_verifier/update_verifier.cpp b/update_verifier/update_verifier.cpp
index 1950cbd83..fdbcfde56 100644
--- a/update_verifier/update_verifier.cpp
+++ b/update_verifier/update_verifier.cpp
@@ -44,6 +44,7 @@
#include <string.h>
#include <unistd.h>
+#include <algorithm>
#include <string>
#include <vector>
@@ -142,17 +143,21 @@ static bool read_blocks(const std::string& partition, const std::string& range_s
return false;
}
- static constexpr int BLOCKSIZE = 4096;
+ static constexpr size_t BLOCKSIZE = 4096;
if (lseek64(fd.get(), static_cast<off64_t>(range_start) * BLOCKSIZE, SEEK_SET) == -1) {
PLOG(ERROR) << "lseek to " << range_start << " failed";
return false;
}
- size_t size = (range_end - range_start) * BLOCKSIZE;
- std::vector<uint8_t> buf(size);
- if (!android::base::ReadFully(fd.get(), buf.data(), size)) {
- PLOG(ERROR) << "Failed to read blocks " << range_start << " to " << range_end;
- return false;
+ size_t remain = (range_end - range_start) * BLOCKSIZE;
+ while (remain > 0) {
+ size_t to_read = std::min(remain, 1024 * BLOCKSIZE);
+ std::vector<uint8_t> buf(to_read);
+ if (!android::base::ReadFully(fd.get(), buf.data(), to_read)) {
+ PLOG(ERROR) << "Failed to read blocks " << range_start << " to " << range_end;
+ return false;
+ }
+ remain -= to_read;
}
blk_count += (range_end - range_start);
}