summaryrefslogtreecommitdiff
path: root/tools/aapt2/java
diff options
context:
space:
mode:
authorDonald Chai <dchai@google.com>2019-05-31 22:13:00 -0700
committerDonald Chai <dchai@google.com>2019-11-08 05:13:53 +0000
commit34ebc8f4355b42dd561e656ff3a240dd8e6bb31d (patch)
tree03314d642936ac26f64ec79d7d807e16b3118c9e /tools/aapt2/java
parentc000664c7c2b9a71fc2ead560acb0611f7f9f41b (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.h6
-rw-r--r--tools/aapt2/java/ProguardRules_test.cpp8
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