Loading crypto/dso/dso.h +4 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,9 @@ typedef struct dso_meth_st /* Return pathname of the module containing location */ int (*pathbyaddr)(void *addr,char *path,int sz); /* Perform global symbol lookup, i.e. among *all* modules, * see commentray in dso_lib.c for further details. */ DSO_FUNC_TYPE (*globallookup)(const char *symname); } DSO_METHOD; /**********************************************************************/ Loading Loading @@ -357,6 +360,7 @@ void ERR_load_DSO_strings(void); #define DSO_F_WIN32_SPLITTER 136 #define DSO_F_WIN32_UNLOAD 121 #define DSO_F_PATHBYADDR 137 #define DSO_F_GLOBAL_LOOKUP_FUNC 138 /* Reason codes. */ #define DSO_R_CTRL_FAILED 100 Loading crypto/dso/dso_dl.c +11 −1 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg); static char *dl_name_converter(DSO *dso, const char *filename); static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2); static int dl_pathbyaddr(void *addr,char *path,int sz); static DSO_FUNC_TYPE dl_globallookup(const char *name); static DSO_METHOD dso_meth_dl = { "OpenSSL 'dl' shared library method", Loading @@ -103,7 +104,8 @@ static DSO_METHOD dso_meth_dl = { dl_merger, NULL, /* init */ NULL, /* finish */ dl_pathbyaddr dl_pathbyaddr, dl_globallookup }; DSO_METHOD *DSO_METHOD_dl(void) Loading Loading @@ -380,4 +382,12 @@ static int dl_pathbyaddr(void *addr,char *path,int sz) return -1; } static DSO_FUNC_TYPE dl_globallookup(const char *name) { DSO_FUNC_TYPE ret; shl_t h = NULL; return shl_findsym(&h,name,TYPE_UNDEFINED,&ret) ? NULL : ret; } #endif /* DSO_DL */ crypto/dso/dso_dlfcn.c +17 −1 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename); static char *dlfcn_merger(DSO *dso, const char *filespec1, const char *filespec2); static int dlfcn_pathbyaddr(void *addr,char *path,int sz); static DSO_FUNC_TYPE dlfcn_globallookup(const char *name); static DSO_METHOD dso_meth_dlfcn = { "OpenSSL 'dlfcn' shared library method", Loading @@ -116,7 +117,8 @@ static DSO_METHOD dso_meth_dlfcn = { dlfcn_merger, NULL, /* init */ NULL, /* finish */ dlfcn_pathbyaddr dlfcn_pathbyaddr, dlfcn_globallookup }; DSO_METHOD *DSO_METHOD_dlfcn(void) Loading Loading @@ -443,4 +445,18 @@ static int dlfcn_pathbyaddr(void *addr,char *path,int sz) ERR_add_error_data(4, "dlfcn_pathbyaddr(): ", dlerror()); return -1; } static DSO_FUNC_TYPE dlfcn_globallookup(const char *name) { union { void *p; DSO_FUNC_TYPE f; } ret = { NULL }; void *handle = dlopen(NULL,RTLD_LAZY); if (handle) { ret.p = dlsym(handle,name); dlclose(handle); } return ret.f; } #endif /* DSO_DLFCN */ crypto/dso/dso_err.c +1 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,7 @@ static ERR_STRING_DATA DSO_str_functs[]= {ERR_FUNC(DSO_F_WIN32_SPLITTER), "WIN32_SPLITTER"}, {ERR_FUNC(DSO_F_WIN32_UNLOAD), "WIN32_UNLOAD"}, {ERR_FUNC(DSO_F_PATHBYADDR), "DSO_pathbyaddr"}, {ERR_FUNC(DSO_F_GLOBAL_LOOKUP_FUNC), "DSO_global_lookup_func"}, {0,NULL} }; Loading crypto/dso/dso_lib.c +21 −0 Original line number Diff line number Diff line Loading @@ -289,6 +289,7 @@ DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname) DSOerr(DSO_F_DSO_BIND_FUNC,DSO_R_UNSUPPORTED); return(NULL); } fprintf(stderr,"boo\n"); if((ret = dso->meth->dso_bind_func(dso, symname)) == NULL) { DSOerr(DSO_F_DSO_BIND_FUNC,DSO_R_SYM_FAILURE); Loading Loading @@ -476,3 +477,23 @@ int DSO_pathbyaddr(void *addr,char *path,int sz) } return (*meth->pathbyaddr)(addr,path,sz); } /* 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 dereference the pointer is doomed to have fatal * consequences. Primary usage for this function is to probe *core* * system functionality, e.g. check if getnameinfo(3) is available * at run-time without bothering about OS-specific details such as * libc.so.versioning or where does it actually reside: in libc * itself or libsocket. */ DSO_FUNC_TYPE DSO_global_lookup_func(const char *name) { DSO_METHOD *meth = default_DSO_meth; if (meth == NULL) meth = DSO_METHOD_openssl(); if (meth->globallookup == NULL) { DSOerr(DSO_F_GLOBAL_LOOKUP_FUNC,DSO_R_UNSUPPORTED); return NULL; } return (*meth->globallookup)(name); } Loading
crypto/dso/dso.h +4 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,9 @@ typedef struct dso_meth_st /* Return pathname of the module containing location */ int (*pathbyaddr)(void *addr,char *path,int sz); /* Perform global symbol lookup, i.e. among *all* modules, * see commentray in dso_lib.c for further details. */ DSO_FUNC_TYPE (*globallookup)(const char *symname); } DSO_METHOD; /**********************************************************************/ Loading Loading @@ -357,6 +360,7 @@ void ERR_load_DSO_strings(void); #define DSO_F_WIN32_SPLITTER 136 #define DSO_F_WIN32_UNLOAD 121 #define DSO_F_PATHBYADDR 137 #define DSO_F_GLOBAL_LOOKUP_FUNC 138 /* Reason codes. */ #define DSO_R_CTRL_FAILED 100 Loading
crypto/dso/dso_dl.c +11 −1 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg); static char *dl_name_converter(DSO *dso, const char *filename); static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2); static int dl_pathbyaddr(void *addr,char *path,int sz); static DSO_FUNC_TYPE dl_globallookup(const char *name); static DSO_METHOD dso_meth_dl = { "OpenSSL 'dl' shared library method", Loading @@ -103,7 +104,8 @@ static DSO_METHOD dso_meth_dl = { dl_merger, NULL, /* init */ NULL, /* finish */ dl_pathbyaddr dl_pathbyaddr, dl_globallookup }; DSO_METHOD *DSO_METHOD_dl(void) Loading Loading @@ -380,4 +382,12 @@ static int dl_pathbyaddr(void *addr,char *path,int sz) return -1; } static DSO_FUNC_TYPE dl_globallookup(const char *name) { DSO_FUNC_TYPE ret; shl_t h = NULL; return shl_findsym(&h,name,TYPE_UNDEFINED,&ret) ? NULL : ret; } #endif /* DSO_DL */
crypto/dso/dso_dlfcn.c +17 −1 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename); static char *dlfcn_merger(DSO *dso, const char *filespec1, const char *filespec2); static int dlfcn_pathbyaddr(void *addr,char *path,int sz); static DSO_FUNC_TYPE dlfcn_globallookup(const char *name); static DSO_METHOD dso_meth_dlfcn = { "OpenSSL 'dlfcn' shared library method", Loading @@ -116,7 +117,8 @@ static DSO_METHOD dso_meth_dlfcn = { dlfcn_merger, NULL, /* init */ NULL, /* finish */ dlfcn_pathbyaddr dlfcn_pathbyaddr, dlfcn_globallookup }; DSO_METHOD *DSO_METHOD_dlfcn(void) Loading Loading @@ -443,4 +445,18 @@ static int dlfcn_pathbyaddr(void *addr,char *path,int sz) ERR_add_error_data(4, "dlfcn_pathbyaddr(): ", dlerror()); return -1; } static DSO_FUNC_TYPE dlfcn_globallookup(const char *name) { union { void *p; DSO_FUNC_TYPE f; } ret = { NULL }; void *handle = dlopen(NULL,RTLD_LAZY); if (handle) { ret.p = dlsym(handle,name); dlclose(handle); } return ret.f; } #endif /* DSO_DLFCN */
crypto/dso/dso_err.c +1 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,7 @@ static ERR_STRING_DATA DSO_str_functs[]= {ERR_FUNC(DSO_F_WIN32_SPLITTER), "WIN32_SPLITTER"}, {ERR_FUNC(DSO_F_WIN32_UNLOAD), "WIN32_UNLOAD"}, {ERR_FUNC(DSO_F_PATHBYADDR), "DSO_pathbyaddr"}, {ERR_FUNC(DSO_F_GLOBAL_LOOKUP_FUNC), "DSO_global_lookup_func"}, {0,NULL} }; Loading
crypto/dso/dso_lib.c +21 −0 Original line number Diff line number Diff line Loading @@ -289,6 +289,7 @@ DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname) DSOerr(DSO_F_DSO_BIND_FUNC,DSO_R_UNSUPPORTED); return(NULL); } fprintf(stderr,"boo\n"); if((ret = dso->meth->dso_bind_func(dso, symname)) == NULL) { DSOerr(DSO_F_DSO_BIND_FUNC,DSO_R_SYM_FAILURE); Loading Loading @@ -476,3 +477,23 @@ int DSO_pathbyaddr(void *addr,char *path,int sz) } return (*meth->pathbyaddr)(addr,path,sz); } /* 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 dereference the pointer is doomed to have fatal * consequences. Primary usage for this function is to probe *core* * system functionality, e.g. check if getnameinfo(3) is available * at run-time without bothering about OS-specific details such as * libc.so.versioning or where does it actually reside: in libc * itself or libsocket. */ DSO_FUNC_TYPE DSO_global_lookup_func(const char *name) { DSO_METHOD *meth = default_DSO_meth; if (meth == NULL) meth = DSO_METHOD_openssl(); if (meth->globallookup == NULL) { DSOerr(DSO_F_GLOBAL_LOOKUP_FUNC,DSO_R_UNSUPPORTED); return NULL; } return (*meth->globallookup)(name); }