summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2022-12-12 17:43:19 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2022-12-12 17:43:19 +0000
commit95f0a957e79e87704ef893e5a7846d844d88c98d (patch)
tree822af341fd79fd17df88b2b5c305bd61f0196f79
parent38a78120109d109d00cf937522f1c2b5f7f944ac (diff)
parent90ec880a11478fe03beaf794f98eccc4be021a65 (diff)
downloadextras-95f0a957e79e87704ef893e5a7846d844d88c98d.tar.gz
Merge "simpleperf: fix ReadMetaInfoFeature for fuzzer."
-rw-r--r--simpleperf/record_file_reader.cpp28
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;