From: Howard Chu Date: Wed, 16 Oct 2024 22:28:02 +0000 (+0100) Subject: Keep module code in a separate object file X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=defcb167fb9d050993c66e94b8eb834418dd135a;p=thirdparty%2Fopenldap.git Keep module code in a separate object file That way programs that don't use these functions won't needlessly depend on -ldl --- diff --git a/libraries/liblmdb/Makefile b/libraries/liblmdb/Makefile index e598afb8e2..e0c0532159 100644 --- a/libraries/liblmdb/Makefile +++ b/libraries/liblmdb/Makefile @@ -67,12 +67,12 @@ test: all rm -rf testdb && mkdir testdb ./mtest && ./mdb_stat testdb -liblmdb.a: mdb.o midl.o - $(AR) rs $@ mdb.o midl.o +liblmdb.a: mdb.o midl.o module.o + $(AR) rs $@ mdb.o midl.o module.o -liblmdb$(SOEXT): mdb.lo midl.lo +liblmdb$(SOEXT): mdb.lo midl.lo module.lo # $(CC) $(LDFLAGS) -pthread -shared -Wl,-Bsymbolic -o $@ mdb.o midl.o $(SOLIBS) - $(CC) $(LDFLAGS) -pthread -shared -o $@ mdb.lo midl.lo $(SOLIBS) + $(CC) $(LDFLAGS) -pthread -shared -o $@ mdb.lo midl.lo module.lo $(SOLIBS) $(LDL) mdb_stat: mdb_stat.o liblmdb.a $(CC) $(LDFLAGS) -o $@ $^ $(LDL) @@ -112,6 +112,9 @@ mdb.lo: mdb.c lmdb.h midl.h midl.lo: midl.c midl.h $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c midl.c -o $@ +module.lo: module.c lmdb.h + $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c module.c -o $@ + %: %.o $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@ diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 2580a92a4a..0dea5c63f4 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -11510,86 +11510,6 @@ mdb_env_set_checksum(MDB_env *env, MDB_sum_func *func, unsigned int size) env->me_sumsize = size; return MDB_SUCCESS; } - -#ifndef _WIN32 -#include -#endif - -void * ESECT -mdb_modload(const char *file, const char *name, MDB_crypto_funcs **mcf_ptr, char **errmsg) -{ - MDB_crypto_hooks *hookfunc; - void *ret = NULL; - if (!name) - name = "MDB_crypto"; - -#ifdef _WIN32 - { - HINSTANCE mlm = LoadLibrary(file); - if (mlm) { - hookfunc = GetProcAddress(mlm, name); - if (hookfunc) - *mcf_ptr = hookfunc(); - else { - *errmsg = "Crypto hook function not found"; - FreeLibrary(mlm); - mlm = NULL; - } - } else { - *errmsg = GetLastError(); - } - ret = (void *)mlm; - } -#else - { - void *mlm = dlopen(file, RTLD_NOW); - if (mlm) { - hookfunc = dlsym(mlm, name); - if (hookfunc) - *mcf_ptr = hookfunc(); - else { - *errmsg = "Crypto hook function not found"; - dlclose(mlm); - mlm = NULL; - } - } else { - *errmsg = dlerror(); - } - ret = mlm; - } -#endif - return ret; -} - -void ESECT -mdb_modunload(void *mlm) -{ -#ifdef _WIN32 - FreeLibrary((HINSTANCE)mlm); -#else - dlclose(mlm); -#endif -} - -void ESECT -mdb_modsetup(MDB_env *env, MDB_crypto_funcs *cf, const char *password) -{ - MDB_val enckey = {0}; - if (cf->mcf_sumfunc) { - mdb_env_set_checksum(env, cf->mcf_sumfunc, cf->mcf_sumsize); - } - if (cf->mcf_encfunc && password) { - char keybuf[2048]; - enckey.mv_data = keybuf; - enckey.mv_size = cf->mcf_keysize; - if (cf->mcf_str2key) - cf->mcf_str2key(password, &enckey); - else - strncpy(enckey.mv_data, password, enckey.mv_size); - mdb_env_set_encrypt(env, cf->mcf_encfunc, &enckey, cf->mcf_esumsize); - memset(enckey.mv_data, 0, enckey.mv_size); - } -} #endif int ESECT diff --git a/libraries/liblmdb/module.c b/libraries/liblmdb/module.c new file mode 100644 index 0000000000..63062ad881 --- /dev/null +++ b/libraries/liblmdb/module.c @@ -0,0 +1,98 @@ +/* module.c - helper for dynamically loading crypto module */ +/* + * Copyright 2020-2021 Howard Chu, Symas Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the Symas + * Dual-Use License. + * + * A copy of this license is available in the file LICENSE in the + * source distribution. + */ +#ifdef _WIN32 +#include +#else +#include +#endif + +#include +#include + +#include "lmdb.h" + +void * +mdb_modload(const char *file, const char *name, MDB_crypto_funcs **mcf_ptr, char **errmsg) +{ + MDB_crypto_hooks *hookfunc; + void *ret = NULL; + if (!name) + name = "MDB_crypto"; + +#ifdef _WIN32 + { + HINSTANCE mlm = LoadLibrary(file); + if (mlm) { + hookfunc = GetProcAddress(mlm, name); + if (hookfunc) + *mcf_ptr = hookfunc(); + else { + *errmsg = "Crypto hook function not found"; + FreeLibrary(mlm); + mlm = NULL; + } + } else { + *errmsg = GetLastError(); + } + ret = (void *)mlm; + } +#else + { + void *mlm = dlopen(file, RTLD_NOW); + if (mlm) { + hookfunc = dlsym(mlm, name); + if (hookfunc) + *mcf_ptr = hookfunc(); + else { + *errmsg = "Crypto hook function not found"; + dlclose(mlm); + mlm = NULL; + } + } else { + *errmsg = dlerror(); + } + ret = mlm; + } +#endif + return ret; +} + +void +mdb_modunload(void *mlm) +{ +#ifdef _WIN32 + FreeLibrary((HINSTANCE)mlm); +#else + dlclose(mlm); +#endif +} + +void +mdb_modsetup(MDB_env *env, MDB_crypto_funcs *cf, const char *password) +{ + MDB_val enckey = {0}; + if (cf->mcf_sumfunc) { + mdb_env_set_checksum(env, cf->mcf_sumfunc, cf->mcf_sumsize); + } + if (cf->mcf_encfunc && password) { + char keybuf[2048]; + enckey.mv_data = keybuf; + enckey.mv_size = cf->mcf_keysize; + if (cf->mcf_str2key) + cf->mcf_str2key(password, &enckey); + else + strncpy(enckey.mv_data, password, enckey.mv_size); + mdb_env_set_encrypt(env, cf->mcf_encfunc, &enckey, cf->mcf_esumsize); + memset(enckey.mv_data, 0, enckey.mv_size); + } +}