X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fdso%2Fdso_lib.c;h=52816dfb9d9812b618677acfe856f86346e1a8d3;hb=6e290a25c2cbdc26119c0866c20d9292f9e64dd8;hp=6bb9f5f18431a9f4ed98d229d40fa86294c9bed9;hpb=d2e9e320186f0917cc940f46bdf1a7e4120da9b0;p=oweals%2Fopenssl.git diff --git a/crypto/dso/dso_lib.c b/crypto/dso/dso_lib.c index 6bb9f5f184..52816dfb9d 100644 --- a/crypto/dso/dso_lib.c +++ b/crypto/dso/dso_lib.c @@ -39,6 +39,7 @@ static DSO *DSO_new_method(DSO_METHOD *meth) ret->references = 1; ret->lock = CRYPTO_THREAD_lock_new(); if (ret->lock == NULL) { + DSOerr(DSO_F_DSO_NEW_METHOD, ERR_R_MALLOC_FAILURE); sk_void_free(ret->meth_data); OPENSSL_free(ret); return NULL; @@ -72,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)) { @@ -303,6 +306,33 @@ char *DSO_convert_filename(DSO *dso, const char *filename) return (result); } +int DSO_pathbyaddr(void *addr, char *path, int sz) +{ + DSO_METHOD *meth = default_DSO_meth; + if (meth == NULL) + meth = DSO_METHOD_openssl(); + if (meth->pathbyaddr == NULL) { + DSOerr(DSO_F_DSO_PATHBYADDR, DSO_R_UNSUPPORTED); + return -1; + } + 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;