KWSys 2026-08-07 (1c806117)

Code extracted from:

    https://gitlab.kitware.com/utils/kwsys.git

at commit 1c8061173731a42a3c1d03abcf261891b493de28 (master).

Upstream Shortlog
-----------------

Matthew Woehlke (3):
      d1a5a40e DynamicLoader: Homogenize platform checks
      49197699 DynamicLoader: Fix use of `0` as null pointer
      81ccb00a DynamicLoader: Add (and use) invalid library constant
This commit is contained in:
KWSys Upstream
2026-08-07 11:13:34 -04:00
committed by Brad King
parent 3d95494391
commit 8931545843
2 changed files with 22 additions and 21 deletions
+16 -16
View File
@@ -30,16 +30,16 @@
// Each part of the ifdef contains a complete implementation for // Each part of the ifdef contains a complete implementation for
// the static methods of DynamicLoader. // the static methods of DynamicLoader.
#define CHECK_OPEN_FLAGS(var, supported, ret) \ #define CHECK_OPEN_FLAGS(var, supported) \
do { \ do { \
/* Check for unknown flags. */ \ /* Check for unknown flags. */ \
if ((var & AllOpenFlags) != var) { \ if ((var & AllOpenFlags) != var) { \
return ret; \ return InvalidLibrary; \
} \ } \
\ \
/* Check for unsupported flags. */ \ /* Check for unsupported flags. */ \
if ((var & (supported)) != var) { \ if ((var & (supported)) != var) { \
return ret; \ return InvalidLibrary; \
} \ } \
} while (0) } while (0)
@@ -61,7 +61,7 @@ namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
return 0; return InvalidLibrary;
} }
int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
@@ -76,7 +76,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, std::string const& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
return 0; return nullptr;
} }
char const* DynamicLoader::LastError() char const* DynamicLoader::LastError()
@@ -96,7 +96,7 @@ namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, 0); CHECK_OPEN_FLAGS(flags, 0);
return shl_load(libname.c_str(), BIND_DEFERRED | DYNAMIC_PATH, 0L); return shl_load(libname.c_str(), BIND_DEFERRED | DYNAMIC_PATH, 0L);
} }
@@ -121,7 +121,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
* TYPE_UNDEFINED Look for any symbol. * TYPE_UNDEFINED Look for any symbol.
*/ */
status = shl_findsym(&lib, sym.c_str(), TYPE_UNDEFINED, &addr); status = shl_findsym(&lib, sym.c_str(), TYPE_UNDEFINED, &addr);
void* result = (status < 0) ? (void*)0 : addr; void* result = (status < 0) ? nullptr : addr;
// Hack to cast pointer-to-data to pointer-to-function. // Hack to cast pointer-to-data to pointer-to-function.
return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result); return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result);
@@ -161,7 +161,7 @@ namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, 0); CHECK_OPEN_FLAGS(flags, 0);
NSObjectFileImageReturnCode rc; NSObjectFileImageReturnCode rc;
NSObjectFileImage image = 0; NSObjectFileImage image = 0;
@@ -169,7 +169,7 @@ DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
rc = NSCreateObjectFileImageFromFile(libname.c_str(), &image); rc = NSCreateObjectFileImageFromFile(libname.c_str(), &image);
// rc == NSObjectFileImageInappropriateFile when trying to load a dylib file // rc == NSObjectFileImageInappropriateFile when trying to load a dylib file
if (rc != NSObjectFileImageSuccess) { if (rc != NSObjectFileImageSuccess) {
return 0; return InvalidLibrary;
} }
NSModule handle = NSLinkModule(image, libname.c_str(), NSModule handle = NSLinkModule(image, libname.c_str(),
NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_BINDNOW |
@@ -192,7 +192,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, std::string const& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
void* result = 0; void* result = nullptr;
// Need to prepend symbols with '_' on Apple-gcc compilers // Need to prepend symbols with '_' on Apple-gcc compilers
std::string rsym = '_' + sym; std::string rsym = '_' + sym;
@@ -207,7 +207,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
char const* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
return 0; return nullptr;
} }
} // namespace KWSYS_NAMESPACE } // namespace KWSYS_NAMESPACE
@@ -223,7 +223,7 @@ namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, SearchBesideLibrary, nullptr); CHECK_OPEN_FLAGS(flags, SearchBesideLibrary);
DWORD llFlags = 0; DWORD llFlags = 0;
if (flags & SearchBesideLibrary) { if (flags & SearchBesideLibrary) {
@@ -310,14 +310,14 @@ static image_id last_dynamic_err = B_OK;
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, 0); CHECK_OPEN_FLAGS(flags, 0);
// image_id's are integers, errors are negative. Add one just in case we // image_id's are integers, errors are negative. Add one just in case we
// get a valid image_id of zero (is that even possible?). // get a valid image_id of zero (is that even possible?).
image_id rc = load_add_on(libname.c_str()); image_id rc = load_add_on(libname.c_str());
if (rc < 0) { if (rc < 0) {
last_dynamic_err = rc; last_dynamic_err = rc;
return 0; return InvalidLibrary;
} }
return rc + 1; return rc + 1;
@@ -390,7 +390,7 @@ namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, nullptr); CHECK_OPEN_FLAGS(flags, 0);
char* name = (char*)calloc(1, libname.size() + 1); char* name = (char*)calloc(1, libname.size() + 1);
dld_init(program_invocation_name); dld_init(program_invocation_name);
@@ -436,7 +436,7 @@ namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname, int flags) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, RTLDGlobal, nullptr); CHECK_OPEN_FLAGS(flags, RTLDGlobal);
int llFlags = RTLD_LAZY; int llFlags = RTLD_LAZY;
if (flags & RTLDGlobal) { if (flags & RTLDGlobal) {
+6 -5
View File
@@ -49,18 +49,19 @@ public:
// They are different on several different OS's // They are different on several different OS's
#if defined(__hpux) #if defined(__hpux)
typedef shl_t LibraryHandle; typedef shl_t LibraryHandle;
static constexpr LibraryHandle InvalidLibrary = 0;
#elif defined(_WIN32) && !defined(__CYGWIN__) #elif defined(_WIN32) && !defined(__CYGWIN__)
typedef HMODULE LibraryHandle; typedef HMODULE LibraryHandle;
#elif defined(__APPLE__) static constexpr LibraryHandle InvalidLibrary = nullptr;
# if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 #elif defined(__APPLE__) && (MAC_OS_X_VERSION_MAX_ALLOWED < 1030)
typedef NSModule LibraryHandle; typedef NSModule LibraryHandle;
# else static constexpr LibraryHandle InvalidLibrary = 0;
typedef void* LibraryHandle;
# endif
#elif defined(__BEOS__) #elif defined(__BEOS__)
typedef image_id LibraryHandle; typedef image_id LibraryHandle;
static constexpr LibraryHandle InvalidLibrary = 0;
#else // POSIX #else // POSIX
typedef void* LibraryHandle; typedef void* LibraryHandle;
static constexpr LibraryHandle InvalidLibrary = nullptr;
#endif #endif
// Return type from DynamicLoader::GetSymbolAddress. // Return type from DynamicLoader::GetSymbolAddress.