Commit 68b64fb6 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Add DSO_global_lookup_func implementation. See commentary in dso_lib.c

for further details.
parent 34b537ee
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;

/**********************************************************************/
@@ -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
+11 −1
Original line number Diff line number Diff line
@@ -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",
@@ -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)
@@ -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 */
+17 −1
Original line number Diff line number Diff line
@@ -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",
@@ -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)
@@ -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 */
+1 −0
Original line number Diff line number Diff line
@@ -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}
	};

+21 −0
Original line number Diff line number Diff line
@@ -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);
@@ -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