Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50bae791 authored by Donald Chai's avatar Donald Chai
Browse files

AAPT2: Sanitize resource qualifiers before using in split names.

Fixes: 67960909
Test: UtilTest.SplitNamesAreSanitized
Change-Id: I9ba1b8430a00cc7ce981075a60388f275c41dbea
(cherry picked from commit b8f078c9)
parent db768d45
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ cc_test_host {
        "test/Builders.cpp",
        "test/Common.cpp",
        "**/*_test.cpp",
    ],
    ] + toolSources,
    static_libs: [
        "libaapt2",
        "libgmock",
+15 −2
Original line number Diff line number Diff line
@@ -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()});

+38 −0
Original line number Diff line number Diff line
/*
 * 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