1  /*
2   * Copyright (c) 2024 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #include "libraryloader.h"
17  
18  #include <dlfcn.h>
19  #include <string>
20  
21  #include "accesstoken_log.h"
22  
23  namespace OHOS {
24  namespace Security {
25  namespace AccessToken {
26  namespace {
27  static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE,
28      SECURITY_DOMAIN_ACCESSTOKEN, "AccessTokenLibLoader"};
29  typedef void* (*FUNC_CREATE) (void);
30  typedef void (*FUNC_DESTROY) (void*);
31  }
32  
LibraryLoader(const std::string & path)33  LibraryLoader::LibraryLoader(const std::string& path)
34  {
35      handle_ = dlopen(path.c_str(), RTLD_LAZY);
36      if (handle_ == nullptr) {
37          PrintErrorLog(path);
38          return;
39      }
40      Create();
41  }
42  
~LibraryLoader()43  LibraryLoader::~LibraryLoader()
44  {
45      if (instance_ != nullptr) {
46          Destroy();
47      }
48  #ifndef FUZZ_ENABLE
49      if (handle_ != nullptr) {
50          dlclose(handle_);
51          handle_ = nullptr;
52      }
53  #endif // FUZZ_ENABLE
54  }
55  
PrintErrorLog(const std::string & targetName)56  bool LibraryLoader::PrintErrorLog(const std::string& targetName)
57  {
58      char* error;
59      if ((error = dlerror()) != nullptr) {
60          ACCESSTOKEN_LOG_ERROR(LABEL, "Get %{public}s failed, errMsg=%{public}s.",
61              targetName.c_str(), error);
62          return false;
63      }
64      return true;
65  }
66  
Create()67  void LibraryLoader::Create()
68  {
69      void* (*create)(void) = reinterpret_cast<FUNC_CREATE>(dlsym(handle_, "Create"));
70      if (!PrintErrorLog("Create")) {
71          return;
72      }
73      instance_ = create();
74  }
75  
Destroy()76  void LibraryLoader::Destroy()
77  {
78      void (*destroy)(void*) = reinterpret_cast<FUNC_DESTROY>(dlsym(handle_, "Destroy"));
79      if (!PrintErrorLog("Destroy")) {
80          return;
81      }
82      destroy(instance_);
83      instance_ = nullptr;
84  }
85  } // AccessToken
86  } // Security
87  } // OHOS