Fix fuzzers and remove hardcoded -j from travis
Fix a couple of broken fuzzers.
Also remove the shadow list of fuzzers from travis and
instead run them all.
Test: manual
Change-Id: I079cfc34acbb4eebbf968c369173772db76b24c1
diff --git a/.travis.yml b/.travis.yml
index 75b6e76..256881c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -155,9 +155,11 @@
- tools/gn gen out/dist --args="${GN_ARGS}" --check
- |
if [[ "$CFG" == ui-* ]]; then
- tools/ninja -C out/dist -j8 ui 2>&1 | grep -v "no version information available"
+ tools/ninja -C out/dist ui 2>&1 | grep -v "no version information"
+ elif [[ "$CFG" == *-libfuzzer ]]; then
+ tools/ninja -C out/dist fuzzers
else
- tools/ninja -C out/dist -j8
+ tools/ninja -C out/dist
fi
- |
TEST_TARGETS="
@@ -166,6 +168,11 @@
"
if [[ "$CFG" == ui-* ]]; then
out/dist/ui_unittests --ci
+ elif [[ "$CFG" == *-libfuzzer ]]; then
+ # Run a single iteration each to make sure they are not crashing.
+ for fuzzer in $(find out/dist -name '*_fuzzer' -executable); do
+ $fuzzer -runs=1
+ done
elif [[ "$CFG" == android-* ]]; then
TARGET_ARCH=$(echo $CFG | cut -d- -f3)
tools/run_android_emulator --pid /tmp/emulator.pid -v &
@@ -179,13 +186,6 @@
done
BENCHMARK_FUNCTIONAL_TEST_ONLY=true out/dist/perfetto_benchmarks
tools/diff_test_trace_processor.py out/dist/trace_processor_shell
- if [[ "$CFG" == *-libfuzzer ]]; then
- # Run a single iteration each to make sure they are not crashing.
- out/dist/end_to_end_shared_memory_fuzzer -runs=1
- out/dist/buffered_frame_deserializer_fuzzer -runs=1
- out/dist/unwinding_fuzzer -runs=1
- out/dist/trace_processor_fuzzer -runs=1
- fi
fi
after_script:
diff --git a/src/profiling/memory/shared_ring_buffer_fuzzer.cc b/src/profiling/memory/shared_ring_buffer_fuzzer.cc
index 7101a15..2fe7554 100644
--- a/src/profiling/memory/shared_ring_buffer_fuzzer.cc
+++ b/src/profiling/memory/shared_ring_buffer_fuzzer.cc
@@ -71,7 +71,8 @@
memcpy(&header, data, sizeof(header));
header.spinlock = 0;
- PERFETTO_CHECK(ftruncate(*fd, total_size_pages * base::kPageSize) == 0);
+ PERFETTO_CHECK(ftruncate(*fd, static_cast<off_t>(total_size_pages *
+ base::kPageSize)) == 0);
PERFETTO_CHECK(base::WriteAll(*fd, &header, sizeof(header)) != -1);
PERFETTO_CHECK(lseek(*fd, base::kPageSize, SEEK_SET) != -1);
PERFETTO_CHECK(base::WriteAll(*fd, payload, payload_size) != -1);
@@ -98,6 +99,8 @@
} // namespace profiling
} // namespace perfetto
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
+
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
return perfetto::profiling::FuzzRingBuffer(data, size);
}
diff --git a/src/profiling/memory/unwinding.h b/src/profiling/memory/unwinding.h
index e4578b0..478e2ea 100644
--- a/src/profiling/memory/unwinding.h
+++ b/src/profiling/memory/unwinding.h
@@ -161,7 +161,7 @@
}
void OnDataAvailable(base::UnixSocket* self) override;
- private:
+ public: // Public for testing / fuzzing.
struct ClientData {
DataSourceInstanceID data_source_instance_id;
std::unique_ptr<base::UnixSocket> sock;
@@ -170,6 +170,8 @@
};
void HandleBuffer(SharedRingBuffer::Buffer* buf, ClientData* socket_data);
+
+ private:
void HandleHandoffSocket(HandoffData data);
void HandleDisconnectSocket(pid_t pid);
diff --git a/src/profiling/memory/unwinding_fuzzer.cc b/src/profiling/memory/unwinding_fuzzer.cc
index a52d673..00bcf4d 100644
--- a/src/profiling/memory/unwinding_fuzzer.cc
+++ b/src/profiling/memory/unwinding_fuzzer.cc
@@ -25,20 +25,27 @@
namespace profiling {
namespace {
+class FakeDelegate : public UnwindingWorker::Delegate {
+ public:
+ ~FakeDelegate() override {}
+ void PostAllocRecord(AllocRecord) override {}
+ void PostFreeRecord(FreeRecord) override {}
+ void PostSocketDisconnected(DataSourceInstanceID, pid_t) override {}
+};
+
int FuzzUnwinding(const uint8_t* data, size_t size) {
- UnwindingRecord record;
- auto unwinding_metadata = std::make_shared<UnwindingMetadata>(
- getpid(), base::OpenFile("/proc/self/maps", O_RDONLY),
- base::OpenFile("/proc/self/mem", O_RDONLY));
+ FakeDelegate delegate;
+ UnwindingWorker worker(&delegate, /*task_runner=*/nullptr);
- record.pid = getpid();
- record.size = size;
- record.data.reset(new uint8_t[size]);
- memcpy(record.data.get(), data, size);
- record.metadata = unwinding_metadata;
+ SharedRingBuffer::Buffer buf(const_cast<uint8_t*>(data), size);
- BookkeepingRecord out;
- HandleUnwindingRecord(&record, &out);
+ UnwindingWorker::ClientData sock_data{
+ 0, nullptr,
+ UnwindingMetadata{getpid(), base::OpenFile("/proc/self/maps", O_RDONLY),
+ base::OpenFile("/proc/self/mem", O_RDONLY)},
+ *SharedRingBuffer::Create(4096)};
+
+ worker.HandleBuffer(&buf, &sock_data);
return 0;
}