diff options
author | Yabin Cui <yabinc@google.com> | 2022-12-12 17:43:19 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-12-12 17:43:19 +0000 |
commit | 95f0a957e79e87704ef893e5a7846d844d88c98d (patch) | |
tree | 822af341fd79fd17df88b2b5c305bd61f0196f79 | |
parent | 38a78120109d109d00cf937522f1c2b5f7f944ac (diff) | |
parent | 90ec880a11478fe03beaf794f98eccc4be021a65 (diff) | |
download | extras-95f0a957e79e87704ef893e5a7846d844d88c98d.tar.gz |
Merge "simpleperf: fix ReadMetaInfoFeature for fuzzer."
-rw-r--r-- | simpleperf/record_file_reader.cpp | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp index 7a3d22a5..c70c0dcb 100644 --- a/simpleperf/record_file_reader.cpp +++ b/simpleperf/record_file_reader.cpp @@ -18,7 +18,9 @@ #include <fcntl.h> #include <string.h> + #include <set> +#include <string_view> #include <vector> #include <android-base/logging.h> @@ -670,14 +672,24 @@ bool RecordFileReader::ReadMetaInfoFeature() { if (!ReadFeatureSection(FEAT_META_INFO, &buf)) { return false; } - const char* p = buf.data(); - const char* end = buf.data() + buf.size(); - while (p < end) { - const char* key = p; - const char* value = key + strlen(key) + 1; - CHECK(value < end); - meta_info_[p] = value; - p = value + strlen(value) + 1; + std::string_view s(buf.data(), buf.size()); + size_t key_start = 0; + while (key_start < s.size()) { + // Parse a C-string for key. + size_t key_end = s.find('\0', key_start); + if (key_end == key_start || key_end == s.npos) { + LOG(ERROR) << "invalid meta info in " << filename_; + return false; + } + // Parse a C-string for value. + size_t value_start = key_end + 1; + size_t value_end = s.find('\0', value_start); + if (value_end == value_start || value_end == s.npos) { + LOG(ERROR) << "invalid meta info in " << filename_; + return false; + } + meta_info_[&s[key_start]] = &s[value_start]; + key_start = value_end + 1; } } return true; |