From b88ccf80aa884df039cd13c5a31f3e08065d487e Mon Sep 17 00:00:00 2001 From: Kelvin Zhang Date: Mon, 10 May 2021 12:17:14 -0400 Subject: [PATCH] Fix segmentation fault in aapt2 When passing a single iterator to std::vector::eraase, only element at that iterator is removed. If no elements are filtered, std::remove_if() returns the end iterator, attempting to erase() the end iterator can cause segmentation fault. This bug causes signing test to fail. https://atp.googleplex.com/tests/asit/ota/signing?tabId=test_run Test: aapt2 PRODUCT/app/CalculatorGooglePrebuilt/CalculatorGooglePrebuilt.apk Bug: 175789289 Bug: 178554651 Change-Id: I813055238bef2dcbdf76172a00b3f44ae940b759 --- tools/aapt2/dump/DumpManifest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp index 61ba09b6a3c9a..f2c6b15bc0cd8 100644 --- a/tools/aapt2/dump/DumpManifest.cpp +++ b/tools/aapt2/dump/DumpManifest.cpp @@ -135,7 +135,8 @@ class ManifestExtractor { template void Filter(Predicate&& func) { children_.erase(std::remove_if(children_.begin(), children_.end(), - [&](const auto& e) { return func(e.get()); })); + [&](const auto& e) { return func(e.get()); }), + children_.end()); } /** Retrieves the list of children of the element. */