summaryrefslogtreecommitdiff
path: root/libsparse/sparse_fuzzer.cpp
diff options
context:
space:
mode:
authorKeith Mok <keithmok@google.com>2021-12-31 05:09:32 +0000
committerKeith Mok <keithmok@google.com>2022-01-07 23:14:11 +0000
commit26787fa9ad88402e8953dfb54a684d0aaa01b441 (patch)
tree340954b8de3e61c9739eb2721cedc0bc352374f4 /libsparse/sparse_fuzzer.cpp
parenta063df23e232aace38a45c8654e4f35a084d7458 (diff)
Add checking for sparse file format
Sparse file can come from an untrusted source. Need more checking to ensure that it is not a malformed file and would not cause any OOB read access. Update fuzz test for decoding also. Ignore-AOSP-First: Awaiting security triage Test: adb reboot fastboot fuzzy_fastboot --gtest_filter=Fuzz.Sparse* fuzzy_fastboot --gtest_filter=Conformance.Sparse* sparse_fuzzer Bug: 212705418 Change-Id: I7622df307bb00e59faaba8bb2c67cb474cffed8e
Diffstat (limited to 'libsparse/sparse_fuzzer.cpp')
-rw-r--r--libsparse/sparse_fuzzer.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/libsparse/sparse_fuzzer.cpp b/libsparse/sparse_fuzzer.cpp
index 42f331fc3b..235d15dce4 100644
--- a/libsparse/sparse_fuzzer.cpp
+++ b/libsparse/sparse_fuzzer.cpp
@@ -1,16 +1,27 @@
#include "include/sparse/sparse.h"
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- if (size < 2 * sizeof(wchar_t)) return 0;
+static volatile int count;
- int64_t blocksize = 4096;
- struct sparse_file* file = sparse_file_new(size, blocksize);
- if (!file) {
+int WriteCallback(void* priv __attribute__((__unused__)), const void* data, size_t len) {
+ if (!data) {
+ return 0;
+ }
+ if (len == 0) {
return 0;
}
- unsigned int block = 1;
- sparse_file_add_data(file, &data, size, block);
- sparse_file_destroy(file);
+ const char* p = (const char*)data;
+ // Just to make sure the data is accessible
+ // We only check the head and tail to save time
+ count += *p;
+ count += *(p+len-1);
return 0;
}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ struct sparse_file* file = sparse_file_import_buf((char*)data, size, true, false);
+ if (!file) {
+ return 0;
+ }
+ return sparse_file_callback(file, false, false, WriteCallback, nullptr);
+}