X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fdso%2Fdso_lib.c;h=52816dfb9d9812b618677acfe856f86346e1a8d3;hb=6e290a25c2cbdc26119c0866c20d9292f9e64dd8;hp=2dac20082ceecdddacc8fd89567166917156014e;hpb=cb6ea61c161e88aa0268c77f308469a67b2ec063;p=oweals%2Fopenssl.git diff --git a/crypto/dso/dso_lib.c b/crypto/dso/dso_lib.c index 2dac20082c..52816dfb9d 100644 --- a/crypto/dso/dso_lib.c +++ b/crypto/dso/dso_lib.c @@ -73,9 +73,11 @@ int DSO_free(DSO *dso) return 1; REF_ASSERT_ISNT(i < 0); - if ((dso->meth->dso_unload != NULL) && !dso->meth->dso_unload(dso)) { - DSOerr(DSO_F_DSO_FREE, DSO_R_UNLOAD_FAILED); - return 0; + if ((dso->flags & DSO_FLAG_NO_UNLOAD_ON_FREE) == 0) { + if ((dso->meth->dso_unload != NULL) && !dso->meth->dso_unload(dso)) { + DSOerr(DSO_F_DSO_FREE, DSO_R_UNLOAD_FAILED); + return 0; + } } if ((dso->meth->finish != NULL) && !dso->meth->finish(dso)) { @@ -316,6 +318,21 @@ int DSO_pathbyaddr(void *addr, char *path, int sz) return (*meth->pathbyaddr) (addr, path, sz); } +DSO *DSO_dsobyaddr(void *addr, int flags) +{ + DSO *ret = NULL; + char *filename = NULL; + int len = DSO_pathbyaddr(addr, NULL, 0); + + filename = OPENSSL_malloc(len); + if (filename != NULL + && DSO_pathbyaddr(addr, filename, len) == len) + ret = DSO_load(NULL, filename, NULL, flags); + + OPENSSL_free(filename); + return ret; +} + void *DSO_global_lookup(const char *name) { DSO_METHOD *meth = default_DSO_meth;