diff options
author | Donald Chai <dchai@google.com> | 2017-10-18 23:51:18 -0700 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-10-27 14:43:09 +0000 |
commit | 93e7dcb9d5ca913855a76282180f3c324fcfeefe (patch) | |
tree | f6209d01b0097d44f3eb2c68677c62194ff66215 | |
parent | 4745025d36ce428dce07ef13ee6039f7234ea087 (diff) | |
download | base-93e7dcb9d5ca913855a76282180f3c324fcfeefe.tar.gz |
AAPT2: Sanitize resource qualifiers before using in split names.
Fixes: 67960909
Test: UtilTest.SplitNamesAreSanitized
Change-Id: I9ba1b8430a00cc7ce981075a60388f275c41dbea
(cherry picked from commit b8f078c9a0c9f32ad84c475c26299ecb00962ffa)
(cherry picked from commit 50bae79111afcdb8d36d73cac15155cb61df2dc0)
-rw-r--r-- | tools/aapt2/Android.bp | 2 | ||||
-rw-r--r-- | tools/aapt2/cmd/Util.cpp | 17 | ||||
-rw-r--r-- | tools/aapt2/cmd/Util_test.cpp | 38 |
3 files changed, 54 insertions, 3 deletions
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index 2ae2e496f25d..76225748009f 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -170,7 +170,7 @@ cc_test_host { "test/Builders.cpp", "test/Common.cpp", "**/*_test.cpp", - ], + ] + toolSources, static_libs: [ "libaapt2", "libgmock", diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp index d17858d45d08..708bed80555b 100644 --- a/tools/aapt2/cmd/Util.cpp +++ b/tools/aapt2/cmd/Util.cpp @@ -72,7 +72,6 @@ bool ParseSplitParameter(const StringPiece& arg, IDiagnostics* diag, std::string } *out_path = parts[0]; - std::vector<ConfigDescription> configs; for (const StringPiece& config_str : util::Tokenize(parts[1], ',')) { ConfigDescription config; if (!ConfigDescription::Parse(config_str, &config)) { @@ -141,6 +140,16 @@ static xml::NamespaceDecl CreateAndroidNamespaceDecl() { return decl; } +static std::string MakePackageSafeName(const std::string &name) { + std::string result(name); + for (char &c : result) { + if (c == '-') { + c = '_'; + } + } + return result; +} + std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, const SplitConstraints& constraints) { const ResourceId kVersionCode(0x0101021b); @@ -172,7 +181,11 @@ std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, if (app_info.split_name) { split_name << app_info.split_name.value() << "."; } - split_name << "config." << util::Joiner(constraints.configs, "_"); + std::vector<std::string> sanitized_config_names; + for (const auto &config : constraints.configs) { + sanitized_config_names.push_back(MakePackageSafeName(config.toString().string())); + } + split_name << "config." << util::Joiner(sanitized_config_names, "_"); manifest_el->attributes.push_back(xml::Attribute{"", "split", split_name.str()}); diff --git a/tools/aapt2/cmd/Util_test.cpp b/tools/aapt2/cmd/Util_test.cpp new file mode 100644 index 000000000000..9c33135f228d --- /dev/null +++ b/tools/aapt2/cmd/Util_test.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Util.h" + +#include "AppInfo.h" +#include "split/TableSplitter.h" +#include "test/Test.h" + +namespace aapt { + +TEST(UtilTest, SplitNamesAreSanitized) { + AppInfo app_info{"com.pkg"}; + SplitConstraints split_constraints{{test::ParseConfigOrDie("en-rUS-land")}}; + + const auto doc = GenerateSplitManifest(app_info, split_constraints); + const auto &root = doc->root; + EXPECT_EQ(root->name, "manifest"); + // split names cannot contain hyphens + EXPECT_EQ(root->FindAttribute("", "split")->value, "config.en_rUS_land"); + // but we should use resource qualifiers verbatim in 'targetConfig'. + EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "en-rUS-land"); +} + +} // namespace aapt |