Home | History | Annotate | Download | only in linker
      1 /*
      2  * Copyright (C) 2016 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 "linker_common_types.h"
     32 
     33 #include <string>
     34 #include <vector>
     35 #include <unordered_set>
     36 
     37 struct android_namespace_t;
     38 
     39 struct android_namespace_link_t {
     40  public:
     41   android_namespace_link_t(android_namespace_t* linked_namespace,
     42                            const std::unordered_set<std::string>& shared_lib_sonames,
     43                            bool allow_all_shared_libs)
     44       : linked_namespace_(linked_namespace), shared_lib_sonames_(shared_lib_sonames),
     45         allow_all_shared_libs_(allow_all_shared_libs)
     46   {}
     47 
     48   android_namespace_t* linked_namespace() const {
     49     return linked_namespace_;
     50   }
     51 
     52   const std::unordered_set<std::string>& shared_lib_sonames() const {
     53     return shared_lib_sonames_;
     54   }
     55 
     56   bool is_accessible(const char* soname) const {
     57     if (soname == nullptr) {
     58       return false;
     59     }
     60     return allow_all_shared_libs_ || shared_lib_sonames_.find(soname) != shared_lib_sonames_.end();
     61   }
     62 
     63   bool allow_all_shared_libs() const {
     64     return allow_all_shared_libs_;
     65   }
     66 
     67  private:
     68   android_namespace_t* const linked_namespace_;
     69   const std::unordered_set<std::string> shared_lib_sonames_;
     70   bool allow_all_shared_libs_;
     71 };
     72 
     73 struct android_namespace_t {
     74  public:
     75   android_namespace_t() : name_(nullptr), is_isolated_(false), is_greylist_enabled_(false) {}
     76 
     77   const char* get_name() const { return name_; }
     78   void set_name(const char* name) { name_ = name; }
     79 
     80   bool is_isolated() const { return is_isolated_; }
     81   void set_isolated(bool isolated) { is_isolated_ = isolated; }
     82 
     83   bool is_greylist_enabled() const { return is_greylist_enabled_; }
     84   void set_greylist_enabled(bool enabled) { is_greylist_enabled_ = enabled; }
     85 
     86   const std::vector<std::string>& get_ld_library_paths() const {
     87     return ld_library_paths_;
     88   }
     89   void set_ld_library_paths(std::vector<std::string>&& library_paths) {
     90     ld_library_paths_ = library_paths;
     91   }
     92 
     93   const std::vector<std::string>& get_default_library_paths() const {
     94     return default_library_paths_;
     95   }
     96   void set_default_library_paths(std::vector<std::string>&& library_paths) {
     97     default_library_paths_ = library_paths;
     98   }
     99   void set_default_library_paths(const std::vector<std::string>& library_paths) {
    100     default_library_paths_ = library_paths;
    101   }
    102 
    103   const std::vector<std::string>& get_permitted_paths() const {
    104     return permitted_paths_;
    105   }
    106   void set_permitted_paths(std::vector<std::string>&& permitted_paths) {
    107     permitted_paths_ = permitted_paths;
    108   }
    109   void set_permitted_paths(const std::vector<std::string>& permitted_paths) {
    110     permitted_paths_ = permitted_paths;
    111   }
    112 
    113   const std::vector<android_namespace_link_t>& linked_namespaces() const {
    114     return linked_namespaces_;
    115   }
    116   void add_linked_namespace(android_namespace_t* linked_namespace,
    117                             const std::unordered_set<std::string>& shared_lib_sonames,
    118                             bool allow_all_shared_libs) {
    119     linked_namespaces_.push_back(
    120         android_namespace_link_t(linked_namespace, shared_lib_sonames, allow_all_shared_libs));
    121   }
    122 
    123   void add_soinfo(soinfo* si) {
    124     soinfo_list_.push_back(si);
    125   }
    126 
    127   void add_soinfos(const soinfo_list_t& soinfos) {
    128     for (auto si : soinfos) {
    129       add_soinfo(si);
    130     }
    131   }
    132 
    133   void remove_soinfo(soinfo* si) {
    134     soinfo_list_.remove_if([&](soinfo* candidate) {
    135       return si == candidate;
    136     });
    137   }
    138 
    139   const soinfo_list_t& soinfo_list() const { return soinfo_list_; }
    140 
    141   // For isolated namespaces - checks if the file is on the search path;
    142   // always returns true for not isolated namespace.
    143   bool is_accessible(const std::string& path);
    144 
    145   // Returns true if si is accessible from this namespace. A soinfo
    146   // is considered accessible when it belongs to this namespace
    147   // or one of it's parent soinfos belongs to this namespace.
    148   bool is_accessible(soinfo* si);
    149 
    150   soinfo_list_t get_global_group();
    151   soinfo_list_t get_shared_group();
    152 
    153  private:
    154   const char* name_;
    155   bool is_isolated_;
    156   bool is_greylist_enabled_;
    157   std::vector<std::string> ld_library_paths_;
    158   std::vector<std::string> default_library_paths_;
    159   std::vector<std::string> permitted_paths_;
    160   // Loader looks into linked namespace if it was not able
    161   // to find a library in this namespace. Note that library
    162   // lookup in linked namespaces are limited by the list of
    163   // shared sonames.
    164   std::vector<android_namespace_link_t> linked_namespaces_;
    165   soinfo_list_t soinfo_list_;
    166 
    167   DISALLOW_COPY_AND_ASSIGN(android_namespace_t);
    168 };
    169