1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #pragma once 30 31 #include <android/api-level.h> 32 33 #include <stdlib.h> 34 #include <limits.h> 35 36 #include <memory> 37 #include <string> 38 #include <vector> 39 #include <unordered_map> 40 41 #include <android-base/macros.h> 42 43 class NamespaceLinkConfig { 44 public: 45 NamespaceLinkConfig() = default; NamespaceLinkConfig(const std::string & ns_name,const std::string & shared_libs,bool allow_all_shared_libs)46 NamespaceLinkConfig(const std::string& ns_name, const std::string& shared_libs, 47 bool allow_all_shared_libs) 48 : ns_name_(ns_name), shared_libs_(shared_libs), 49 allow_all_shared_libs_(allow_all_shared_libs) {} 50 ns_name()51 const std::string& ns_name() const { 52 return ns_name_; 53 } 54 shared_libs()55 const std::string& shared_libs() const { 56 return shared_libs_; 57 } 58 allow_all_shared_libs()59 bool allow_all_shared_libs() const { 60 return allow_all_shared_libs_; 61 } 62 63 private: 64 std::string ns_name_; 65 std::string shared_libs_; 66 bool allow_all_shared_libs_; 67 }; 68 69 class NamespaceConfig { 70 public: NamespaceConfig(const std::string & name)71 explicit NamespaceConfig(const std::string& name) 72 : name_(name), isolated_(false), visible_(false) 73 {} 74 name()75 const char* name() const { 76 return name_.c_str(); 77 } 78 isolated()79 bool isolated() const { 80 return isolated_; 81 } 82 visible()83 bool visible() const { 84 return visible_; 85 } 86 search_paths()87 const std::vector<std::string>& search_paths() const { 88 return search_paths_; 89 } 90 permitted_paths()91 const std::vector<std::string>& permitted_paths() const { 92 return permitted_paths_; 93 } 94 whitelisted_libs()95 const std::vector<std::string>& whitelisted_libs() const { 96 return whitelisted_libs_; 97 } 98 links()99 const std::vector<NamespaceLinkConfig>& links() const { 100 return namespace_links_; 101 } 102 add_namespace_link(const std::string & ns_name,const std::string & shared_libs,bool allow_all_shared_libs)103 void add_namespace_link(const std::string& ns_name, const std::string& shared_libs, 104 bool allow_all_shared_libs) { 105 namespace_links_.push_back(NamespaceLinkConfig(ns_name, shared_libs, allow_all_shared_libs)); 106 } 107 set_isolated(bool isolated)108 void set_isolated(bool isolated) { 109 isolated_ = isolated; 110 } 111 set_visible(bool visible)112 void set_visible(bool visible) { 113 visible_ = visible; 114 } 115 set_search_paths(std::vector<std::string> && search_paths)116 void set_search_paths(std::vector<std::string>&& search_paths) { 117 search_paths_ = std::move(search_paths); 118 } 119 set_permitted_paths(std::vector<std::string> && permitted_paths)120 void set_permitted_paths(std::vector<std::string>&& permitted_paths) { 121 permitted_paths_ = std::move(permitted_paths); 122 } 123 set_whitelisted_libs(std::vector<std::string> && whitelisted_libs)124 void set_whitelisted_libs(std::vector<std::string>&& whitelisted_libs) { 125 whitelisted_libs_ = std::move(whitelisted_libs); 126 } 127 private: 128 const std::string name_; 129 bool isolated_; 130 bool visible_; 131 std::vector<std::string> search_paths_; 132 std::vector<std::string> permitted_paths_; 133 std::vector<std::string> whitelisted_libs_; 134 std::vector<NamespaceLinkConfig> namespace_links_; 135 136 DISALLOW_IMPLICIT_CONSTRUCTORS(NamespaceConfig); 137 }; 138 139 class Config { 140 public: Config()141 Config() : target_sdk_version_(__ANDROID_API__) {} 142 namespace_configs()143 const std::vector<std::unique_ptr<NamespaceConfig>>& namespace_configs() const { 144 return namespace_configs_; 145 } 146 default_namespace_config()147 const NamespaceConfig* default_namespace_config() const { 148 auto it = namespace_configs_map_.find("default"); 149 return it == namespace_configs_map_.end() ? nullptr : it->second; 150 } 151 target_sdk_version()152 int target_sdk_version() const { 153 return target_sdk_version_; 154 } 155 156 // note that this is one time event and therefore there is no need to 157 // read every section of the config. Every linker instance needs at 158 // most one configuration. 159 // Returns false in case of an error. If binary config was not found 160 // sets *config = nullptr. 161 static bool read_binary_config(const char* ld_config_file_path, 162 const char* binary_realpath, 163 bool is_asan, 164 const Config** config, 165 std::string* error_msg); 166 167 static std::string get_vndk_version_string(const char delimiter); 168 private: 169 void clear(); 170 set_target_sdk_version(int target_sdk_version)171 void set_target_sdk_version(int target_sdk_version) { 172 target_sdk_version_ = target_sdk_version; 173 } 174 175 NamespaceConfig* create_namespace_config(const std::string& name); 176 177 std::vector<std::unique_ptr<NamespaceConfig>> namespace_configs_; 178 std::unordered_map<std::string, NamespaceConfig*> namespace_configs_map_; 179 int target_sdk_version_; 180 181 DISALLOW_COPY_AND_ASSIGN(Config); 182 }; 183