diff --git a/base/Android.bp b/base/Android.bp index b9a6e0bd6..a7600f39f 100644 --- a/base/Android.bp +++ b/base/Android.bp @@ -37,6 +37,9 @@ cc_library { cppflags: libbase_cppflags, export_include_dirs: ["include"], shared_libs: ["liblog"], + sanitize: { + misc_undefined: ["integer"], + }, target: { android: { srcs: [ @@ -86,6 +89,9 @@ cc_test { "strings_test.cpp", "test_main.cpp", ], + sanitize: { + misc_undefined: ["integer"], + }, target: { android: { srcs: ["properties_test.cpp"], diff --git a/base/strings.cpp b/base/strings.cpp index 46fe93995..bfdaf1244 100644 --- a/base/strings.cpp +++ b/base/strings.cpp @@ -36,11 +36,12 @@ std::vector Split(const std::string& s, size_t base = 0; size_t found; - do { + while (true) { found = s.find_first_of(delimiters, base); result.push_back(s.substr(base, found - base)); + if (found == s.npos) break; base = found + 1; - } while (found != s.npos); + } return result; } diff --git a/base/strings_test.cpp b/base/strings_test.cpp index 7a65a00b1..7ed5b2b08 100644 --- a/base/strings_test.cpp +++ b/base/strings_test.cpp @@ -251,3 +251,7 @@ TEST(strings, EqualsIgnoreCase) { ASSERT_FALSE(android::base::EqualsIgnoreCase("foo", "bar")); ASSERT_FALSE(android::base::EqualsIgnoreCase("foo", "fool")); } + +TEST(strings, ubsan_28729303) { + android::base::Split("/dev/null", ":"); +}