1*e5eeaa8eSAndroid Build Coastguard Worker /*
2*e5eeaa8eSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*e5eeaa8eSAndroid Build Coastguard Worker *
4*e5eeaa8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e5eeaa8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e5eeaa8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e5eeaa8eSAndroid Build Coastguard Worker *
8*e5eeaa8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e5eeaa8eSAndroid Build Coastguard Worker *
10*e5eeaa8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e5eeaa8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e5eeaa8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e5eeaa8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e5eeaa8eSAndroid Build Coastguard Worker * limitations under the License.
15*e5eeaa8eSAndroid Build Coastguard Worker */
16*e5eeaa8eSAndroid Build Coastguard Worker #pragma once
17*e5eeaa8eSAndroid Build Coastguard Worker
18*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/strings.h>
19*e5eeaa8eSAndroid Build Coastguard Worker
20*e5eeaa8eSAndroid Build Coastguard Worker #include <algorithm>
21*e5eeaa8eSAndroid Build Coastguard Worker
22*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/namespace.h"
23*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/variables.h"
24*e5eeaa8eSAndroid Build Coastguard Worker
MockVndkVariables(const std::string & partition,const std::string & vndk_ver)25*e5eeaa8eSAndroid Build Coastguard Worker inline void MockVndkVariables(const std::string& partition,
26*e5eeaa8eSAndroid Build Coastguard Worker const std::string& vndk_ver) {
27*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::Variables;
28*e5eeaa8eSAndroid Build Coastguard Worker
29*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue(partition + "_VNDK_VERSION", vndk_ver);
30*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("LLNDK_LIBRARIES_" + partition, "llndk_libraries");
31*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("PRIVATE_LLNDK_LIBRARIES_" + partition,
32*e5eeaa8eSAndroid Build Coastguard Worker "private_llndk_libraries");
33*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("VNDK_SAMEPROCESS_LIBRARIES_" + partition,
34*e5eeaa8eSAndroid Build Coastguard Worker "vndk_sameprocess_libraries");
35*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("VNDK_CORE_LIBRARIES_" + partition, "vndk_core_libraries");
36*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("SANITIZER_DEFAULT_" + partition,
37*e5eeaa8eSAndroid Build Coastguard Worker "sanitizer_default_libraries");
38*e5eeaa8eSAndroid Build Coastguard Worker }
39*e5eeaa8eSAndroid Build Coastguard Worker
40*e5eeaa8eSAndroid Build Coastguard Worker inline void MockVariables(std::string vndk_ver = "Q") {
41*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::Variables;
42*e5eeaa8eSAndroid Build Coastguard Worker
43*e5eeaa8eSAndroid Build Coastguard Worker MockVndkVariables("VENDOR", vndk_ver);
44*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("ro.vndk.version", vndk_ver);
45*e5eeaa8eSAndroid Build Coastguard Worker
46*e5eeaa8eSAndroid Build Coastguard Worker MockVndkVariables("PRODUCT", vndk_ver);
47*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("ro.product.vndk.version", vndk_ver);
48*e5eeaa8eSAndroid Build Coastguard Worker
49*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("ro.treble.enabled", "true");
50*e5eeaa8eSAndroid Build Coastguard Worker
51*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("SYSTEM_EXT", "/system_ext");
52*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("PRODUCT", "/procut");
53*e5eeaa8eSAndroid Build Coastguard Worker
54*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("VNDK_USING_CORE_VARIANT_LIBRARIES",
55*e5eeaa8eSAndroid Build Coastguard Worker "vndk_using_core_variant_libraries");
56*e5eeaa8eSAndroid Build Coastguard Worker Variables::AddValue("SANITIZER_RUNTIME_LIBRARIES",
57*e5eeaa8eSAndroid Build Coastguard Worker "sanitizer_runtime_libraries");
58*e5eeaa8eSAndroid Build Coastguard Worker }
59*e5eeaa8eSAndroid Build Coastguard Worker
ContainsPath(const std::vector<std::string> & path_list,const std::string & path)60*e5eeaa8eSAndroid Build Coastguard Worker inline bool ContainsPath(const std::vector<std::string>& path_list,
61*e5eeaa8eSAndroid Build Coastguard Worker const std::string& path) {
62*e5eeaa8eSAndroid Build Coastguard Worker return std::any_of(path_list.begin(),
63*e5eeaa8eSAndroid Build Coastguard Worker path_list.end(),
64*e5eeaa8eSAndroid Build Coastguard Worker [&](const std::string& item) { return item == path; });
65*e5eeaa8eSAndroid Build Coastguard Worker }
66*e5eeaa8eSAndroid Build Coastguard Worker
ContainsSearchPath(const android::linkerconfig::modules::Namespace * ns,const std::string & path)67*e5eeaa8eSAndroid Build Coastguard Worker inline bool ContainsSearchPath(
68*e5eeaa8eSAndroid Build Coastguard Worker const android::linkerconfig::modules::Namespace* ns,
69*e5eeaa8eSAndroid Build Coastguard Worker const std::string& path) {
70*e5eeaa8eSAndroid Build Coastguard Worker if (!ContainsPath(ns->SearchPaths(), path)) {
71*e5eeaa8eSAndroid Build Coastguard Worker return false;
72*e5eeaa8eSAndroid Build Coastguard Worker }
73*e5eeaa8eSAndroid Build Coastguard Worker
74*e5eeaa8eSAndroid Build Coastguard Worker auto asan_search_path = ns->AsanSearchPaths();
75*e5eeaa8eSAndroid Build Coastguard Worker
76*e5eeaa8eSAndroid Build Coastguard Worker if (!ContainsPath(asan_search_path, path)) {
77*e5eeaa8eSAndroid Build Coastguard Worker return false;
78*e5eeaa8eSAndroid Build Coastguard Worker }
79*e5eeaa8eSAndroid Build Coastguard Worker
80*e5eeaa8eSAndroid Build Coastguard Worker if (!android::base::StartsWith(path, "/apex") &&
81*e5eeaa8eSAndroid Build Coastguard Worker !ContainsPath(asan_search_path, "/data/asan" + path)) {
82*e5eeaa8eSAndroid Build Coastguard Worker return false;
83*e5eeaa8eSAndroid Build Coastguard Worker }
84*e5eeaa8eSAndroid Build Coastguard Worker
85*e5eeaa8eSAndroid Build Coastguard Worker return true;
86*e5eeaa8eSAndroid Build Coastguard Worker }
87*e5eeaa8eSAndroid Build Coastguard Worker
ContainsPermittedPath(const android::linkerconfig::modules::Namespace * ns,const std::string & path)88*e5eeaa8eSAndroid Build Coastguard Worker inline bool ContainsPermittedPath(
89*e5eeaa8eSAndroid Build Coastguard Worker const android::linkerconfig::modules::Namespace* ns,
90*e5eeaa8eSAndroid Build Coastguard Worker const std::string& path) {
91*e5eeaa8eSAndroid Build Coastguard Worker if (!ContainsPath(ns->PermittedPaths(), path)) {
92*e5eeaa8eSAndroid Build Coastguard Worker return false;
93*e5eeaa8eSAndroid Build Coastguard Worker }
94*e5eeaa8eSAndroid Build Coastguard Worker
95*e5eeaa8eSAndroid Build Coastguard Worker auto asan_search_path = ns->AsanPermittedPaths();
96*e5eeaa8eSAndroid Build Coastguard Worker
97*e5eeaa8eSAndroid Build Coastguard Worker if (!ContainsPath(asan_search_path, path)) {
98*e5eeaa8eSAndroid Build Coastguard Worker return false;
99*e5eeaa8eSAndroid Build Coastguard Worker }
100*e5eeaa8eSAndroid Build Coastguard Worker
101*e5eeaa8eSAndroid Build Coastguard Worker if (!android::base::StartsWith(path, "/apex") &&
102*e5eeaa8eSAndroid Build Coastguard Worker !ContainsPath(asan_search_path, "/data/asan" + path)) {
103*e5eeaa8eSAndroid Build Coastguard Worker return false;
104*e5eeaa8eSAndroid Build Coastguard Worker }
105*e5eeaa8eSAndroid Build Coastguard Worker
106*e5eeaa8eSAndroid Build Coastguard Worker return true;
107*e5eeaa8eSAndroid Build Coastguard Worker }