diff --git a/chromiumos-wide-profiling/buffer_reader.h b/chromiumos-wide-profiling/buffer_reader.h index 27c3c99..cc569ac 100644 --- a/chromiumos-wide-profiling/buffer_reader.h +++ b/chromiumos-wide-profiling/buffer_reader.h @@ -19,8 +19,12 @@ class BufferReader : public DataReader { size_ = size; } - void SeekSet(size_t offset) override { + bool SeekSet(size_t offset) override { + if (offset >= size_) { + return false; + } offset_ = offset; + return true; } size_t Tell() const override { diff --git a/chromiumos-wide-profiling/data_reader.h b/chromiumos-wide-profiling/data_reader.h index d5fcea7..85f8a5a 100644 --- a/chromiumos-wide-profiling/data_reader.h +++ b/chromiumos-wide-profiling/data_reader.h @@ -17,7 +17,7 @@ class DataReader { // Moves the data read pointer to |offset| bytes from the beginning of the // data. - virtual void SeekSet(size_t offset) = 0; + virtual bool SeekSet(size_t offset) = 0; // Returns the position of the data read pointer, in bytes from the beginning // of the data. diff --git a/chromiumos-wide-profiling/perf_parser.cc b/chromiumos-wide-profiling/perf_parser.cc index 33ddbe2..7d18926 100644 --- a/chromiumos-wide-profiling/perf_parser.cc +++ b/chromiumos-wide-profiling/perf_parser.cc @@ -237,7 +237,10 @@ void PerfParser::MaybeSortParsedEvents() { event_and_time->event = &parsed_event; struct perf_sample sample_info; - CHECK(reader_.ReadPerfSampleInfo(*parsed_event.raw_event, &sample_info)); + if (reader_.ReadPerfSampleInfo(*parsed_event.raw_event, &sample_info) == false) { + LOG(ERROR) << "Skip one unsupported event." ; + continue; + } event_and_time->time = sample_info.time; events_and_times.emplace_back(std::move(event_and_time)); diff --git a/chromiumos-wide-profiling/perf_reader.cc b/chromiumos-wide-profiling/perf_reader.cc index bdc7360..1f8228a 100644 --- a/chromiumos-wide-profiling/perf_reader.cc +++ b/chromiumos-wide-profiling/perf_reader.cc @@ -1318,7 +1318,9 @@ bool PerfReader::ReadMetadata(DataReader* data) { for (u32 type = HEADER_FIRST_FEATURE; type != HEADER_LAST_FEATURE; ++type) { if ((metadata_mask_ & (1 << type)) == 0) continue; - data->SeekSet(section_iter->offset); + if (data->SeekSet(section_iter->offset) == false) { + continue; + } u64 size = section_iter->size; switch (type) {