diff options
author | Matt Caswell <matt@openssl.org> | 2016-10-15 16:01:40 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-11-02 23:37:26 +0000 |
commit | f722f18e1a3560c13bd018711a30acca73c8d619 (patch) | |
tree | 65fe5f75261983b0e01ffac865eeb3a3cba14ed3 /crypto | |
parent | 93558bf5190226494d3b549397fbf94214846d0d (diff) |
Add a DSO_dsobyaddr() function
This works the same way as DSO_pathbyaddr() but instead returns a ptr to
the DSO that contains the provided symbol.
Reviewed-by: Tim Hudson <tjh@openssl.org>
(cherry picked from commit b39eda7ee69a9277c722f8789736e00dc680cda6)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/dso/dso_lib.c | 23 |
1 files changed, 20 insertions, 3 deletions
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; |