diff --git a/native/src/init/getinfo.cpp b/native/src/init/getinfo.cpp index 5d5bf1e32..66d7b1a7d 100644 --- a/native/src/init/getinfo.cpp +++ b/native/src/init/getinfo.cpp @@ -41,16 +41,16 @@ static string extract_quoted_str_until(chars, chars, } // Parse string into key value pairs. -// The string format: [delim][key][padding]=[padding][value][delim] -template +// The string format: [delim][key][padding][eq][padding][value][delim] +template static kv_pairs parse_impl(chars, string_view str) { kv_pairs kv; - char skip_array[] = {'=', padding...}; + char skip_array[] = {eq, padding...}; string_view skip(skip_array, std::size(skip_array)); bool quoted = false; for (size_t pos = 0u; pos < str.size(); pos = str.find_first_not_of(delim, pos)) { auto key = extract_quoted_str_until( - chars{}, chars<'='>{}, str, pos, quoted); + chars{}, chars{}, str, pos, quoted); pos = str.find_first_not_of(skip, pos); if (pos == string_view::npos || str[pos] == delim) { kv.emplace_back(key, ""); @@ -63,10 +63,13 @@ static kv_pairs parse_impl(chars, string_view str) { } static kv_pairs parse_cmdline(string_view str) { - return parse_impl<' '>(chars<>{}, str); + return parse_impl<' ', '='>(chars<>{}, str); } static kv_pairs parse_bootconfig(string_view str) { - return parse_impl<'\n'>(chars<' '>{}, str); + return parse_impl<'\n', '='>(chars<' '>{}, str); +} +static kv_pairs parse_partition_map(std::string_view str) { + return parse_impl<';', ','>(chars<>{}, str); } #define test_bit(bit, array) (array[bit / 8] & (1 << (bit % 8))) @@ -214,25 +217,16 @@ void load_kernel_info(BootConfig *config) { // https://android.googlesource.com/platform/system/core/+/refs/heads/android13-release/init/devices.cpp#191 kv_pairs load_partition_map() { - kv_pairs partition_map; - auto fn = [&partition_map](const kv_pairs &kv) { - for (const auto &[key, value] : kv) { - if (key != "androidboot.partition_map") - continue; - for (const auto &map : split(value, ";")) { - auto map_pieces = split(map, ","); - if (map_pieces.size() != 2) { - LOGE("Expected a comma separated device,partition mapping, but found '%s'", map.c_str()); - continue; - } - partition_map.emplace_back(map_pieces[0], map_pieces[1]); - } - } - }; - - fn(parse_cmdline(full_read("/proc/cmdline"))); - fn(parse_bootconfig(full_read("/proc/bootconfig"))); - return partition_map; + const string_view kPartitionMapKey = "androidboot.partition_map"; + for (const auto &[key, value] : parse_cmdline(full_read("/proc/cmdline"))) { + if (key == kPartitionMapKey) + return parse_partition_map(value); + } + for (const auto &[key, value] : parse_bootconfig(full_read("/proc/bootconfig"))) { + if (key == kPartitionMapKey) + return parse_partition_map(value); + } + return {}; } std::string get_partition_name_for_device(const kv_pairs &partition_map, const std::string &query_device){