| Index: openssl/crypto/dso/dso_dl.c
|
| ===================================================================
|
| --- openssl/crypto/dso/dso_dl.c (revision 105093)
|
| +++ openssl/crypto/dso/dso_dl.c (working copy)
|
| @@ -85,6 +85,8 @@
|
| #endif
|
| 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 void *dl_globallookup(const char *name);
|
|
|
| static DSO_METHOD dso_meth_dl = {
|
| "OpenSSL 'dl' shared library method",
|
| @@ -101,7 +103,9 @@
|
| dl_name_converter,
|
| dl_merger,
|
| NULL, /* init */
|
| - NULL /* finish */
|
| + NULL, /* finish */
|
| + dl_pathbyaddr,
|
| + dl_globallookup
|
| };
|
|
|
| DSO_METHOD *DSO_METHOD_dl(void)
|
| @@ -350,4 +354,40 @@
|
| return(translated);
|
| }
|
|
|
| +static int dl_pathbyaddr(void *addr,char *path,int sz)
|
| + {
|
| + struct shl_descriptor inf;
|
| + int i,len;
|
| +
|
| + if (addr == NULL)
|
| + {
|
| + union { int(*f)(void*,char*,int); void *p; } t =
|
| + { dl_pathbyaddr };
|
| + addr = t.p;
|
| + }
|
| +
|
| + for (i=-1;shl_get_r(i,&inf)==0;i++)
|
| + {
|
| + if (((size_t)addr >= inf.tstart && (size_t)addr < inf.tend) ||
|
| + ((size_t)addr >= inf.dstart && (size_t)addr < inf.dend))
|
| + {
|
| + len = (int)strlen(inf.filename);
|
| + if (sz <= 0) return len+1;
|
| + if (len >= sz) len=sz-1;
|
| + memcpy(path,inf.filename,len);
|
| + path[len++] = 0;
|
| + return len;
|
| + }
|
| + }
|
| +
|
| + return -1;
|
| + }
|
| +
|
| +static void *dl_globallookup(const char *name)
|
| + {
|
| + void *ret;
|
| + shl_t h = NULL;
|
| +
|
| + return shl_findsym(&h,name,TYPE_UNDEFINED,&ret) ? NULL : ret;
|
| + }
|
| #endif /* DSO_DL */
|
|
|