• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 5123321399

30 May 2023 04:06PM UTC coverage: 92.213% (+0.004%) from 92.209%
5123321399

Pull #3558

github

web-flow
Merge dd72f7389 into 057bcbc35
Pull Request #3558: Add braces around all if/else statements

75602 of 81986 relevant lines covered (92.21%)

11859779.3 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.3
/src/lib/utils/dyn_load/dyn_load.cpp
1
/*
2
* Dynamically Loaded Object
3
* (C) 2010 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7

8
#include <botan/internal/dyn_load.h>
9

10
#include <botan/exceptn.h>
11
#include <botan/internal/fmt.h>
12
#include <sstream>
13

14
#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
15
   #include <dlfcn.h>
16
#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
17
   #define NOMINMAX 1
18
   #define _WINSOCKAPI_  // stop windows.h including winsock.h
19
   #include <windows.h>
20
#endif
21

22
namespace Botan {
23

24
namespace {
25

26
void raise_runtime_loader_exception(std::string_view lib_name, const char* msg) {
1✔
27
   std::ostringstream err;
1✔
28
   err << "Failed to load " << lib_name << ": ";
1✔
29
   if(msg) {
1✔
30
      err << msg;
1✔
31
   } else {
32
      err << "Unknown error";
×
33
   }
34

35
   throw System_Error(err.str(), 0);
2✔
36
}
1✔
37

38
}  // namespace
39

40
Dynamically_Loaded_Library::Dynamically_Loaded_Library(std::string_view library) : m_lib_name(library), m_lib(nullptr) {
76✔
41
#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
42
   m_lib = ::dlopen(m_lib_name.c_str(), RTLD_LAZY);
76✔
43

44
   if(!m_lib) {
76✔
45
      raise_runtime_loader_exception(m_lib_name, ::dlerror());
1✔
46
   }
47

48
#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
49
   m_lib = ::LoadLibraryA(m_lib_name.c_str());
50

51
   if(!m_lib)
52
      raise_runtime_loader_exception(m_lib_name, "LoadLibrary failed");
53
#endif
54

55
   if(!m_lib) {
75✔
56
      raise_runtime_loader_exception(m_lib_name, "Dynamic load not supported");
57
   }
58
}
76✔
59

60
Dynamically_Loaded_Library::~Dynamically_Loaded_Library() {
75✔
61
#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
62
   ::dlclose(m_lib);
75✔
63
#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
64
   ::FreeLibrary(reinterpret_cast<HMODULE>(m_lib));
65
#endif
66
}
75✔
67

68
void* Dynamically_Loaded_Library::resolve_symbol(const std::string& symbol) {
77✔
69
   void* addr = nullptr;
77✔
70

71
#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
72
   addr = ::dlsym(m_lib, symbol.c_str());
77✔
73
#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
74
   addr = reinterpret_cast<void*>(::GetProcAddress(reinterpret_cast<HMODULE>(m_lib), symbol.c_str()));
75
#endif
76

77
   if(!addr) {
77✔
78
      throw Invalid_Argument(fmt("Failed to resolve symbol {} in {}", symbol, m_lib_name));
×
79
   }
80

81
   return addr;
77✔
82
}
83

84
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc