diff options
author | Donald Chai <dchai@google.com> | 2019-05-31 22:13:00 -0700 |
---|---|---|
committer | Donald Chai <dchai@google.com> | 2019-11-08 05:13:53 +0000 |
commit | 34ebc8f4355b42dd561e656ff3a240dd8e6bb31d (patch) | |
tree | 03314d642936ac26f64ec79d7d807e16b3118c9e /tools/aapt2/java | |
parent | c000664c7c2b9a71fc2ead560acb0611f7f9f41b (diff) |
[aapt2] Fix infinite loop in proguard::CollectLocations
std::set only works correctly when the < comparator is a strict weak
ordering, while UsageLocation::operator< was actually implementing !=.
Bug: 134190468
Change-Id: Icb9407e9c8451f9fcb4eb9b2cea310e3bcaf159e
Tested: aapt2_tests, and b/134190468#comment1
(cherry picked from commit 44fa342eb91b90df7998fa2808e21af75aafaf39)
Diffstat (limited to 'tools/aapt2/java')
-rw-r--r-- | tools/aapt2/java/ProguardRules.h | 6 | ||||
-rw-r--r-- | tools/aapt2/java/ProguardRules_test.cpp | 8 |
2 files changed, 12 insertions, 2 deletions
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h index f9656d112b7b..b15df59f56a6 100644 --- a/tools/aapt2/java/ProguardRules.h +++ b/tools/aapt2/java/ProguardRules.h @@ -99,11 +99,13 @@ bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, // inline bool operator==(const UsageLocation& lhs, const UsageLocation& rhs) { + // The "source" member is ignored because we only need "name" for outputting + // keep rules; "source" is used for comments. return lhs.name == rhs.name; } -inline int operator<(const UsageLocation& lhs, const UsageLocation& rhs) { - return lhs.name.compare(rhs.name); +inline bool operator<(const UsageLocation& lhs, const UsageLocation& rhs) { + return lhs.name.compare(rhs.name) < 0; } // diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp index 559b07af3e80..25b55ab003b0 100644 --- a/tools/aapt2/java/ProguardRules_test.cpp +++ b/tools/aapt2/java/ProguardRules_test.cpp @@ -364,4 +364,12 @@ TEST(ProguardRulesTest, TransitionRulesAreEmitted) { "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } +TEST(ProguardRulesTest, UsageLocationComparator) { + proguard::UsageLocation location1 = {{"pkg", ResourceType::kAttr, "x"}}; + proguard::UsageLocation location2 = {{"pkg", ResourceType::kAttr, "y"}}; + + EXPECT_EQ(location1 < location2, true); + EXPECT_EQ(location2 < location1, false); +} + } // namespace aapt |