Commit b39eda7e authored by Matt Caswell's avatar Matt Caswell
Browse files

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: default avatarTim Hudson <tjh@openssl.org>
parent cb6ea61c
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -73,10 +73,12 @@ int DSO_free(DSO *dso)
        return 1;
    REF_ASSERT_ISNT(i < 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)) {
        DSOerr(DSO_F_DSO_FREE, DSO_R_FINISH_FAILED);
@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ extern "C" {
 */
# define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY      0x02

/*
 * Don't unload the DSO when we call DSO_free()
 */
# define DSO_FLAG_NO_UNLOAD_ON_FREE              0x04

/*
 * This flag loads the library with public symbols. Meaning: The exported
 * symbols of this library are public to all libraries loaded after this
@@ -141,6 +146,12 @@ DSO_METHOD *DSO_METHOD_openssl(void);
 */
int DSO_pathbyaddr(void *addr, char *path, int sz);

/*
 * Like DSO_pathbyaddr() but instead returns a handle to the DSO for the symbol
 * or NULL on error.
 */
DSO *DSO_dsobyaddr(void *addr, int flags);

/*
 * This function should be used with caution! It looks up symbols in *all*
 * loaded modules and if module gets unloaded by somebody else attempt to
+1 −0
Original line number Diff line number Diff line
@@ -4217,3 +4217,4 @@ BIO_write_ex 4167 1_1_1 EXIST::FUNCTION:
BIO_meth_get_write_ex                   4168	1_1_1	EXIST::FUNCTION:
BIO_meth_set_write_ex                   4169	1_1_1	EXIST::FUNCTION:
DSO_pathbyaddr                          4170	1_1_0c	EXIST::FUNCTION:
DSO_dsobyaddr                           4171	1_1_0c	EXIST::FUNCTION: