summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/dso/dso.h12
-rw-r--r--crypto/dso/dso_dl.c23
-rw-r--r--crypto/dso/dso_dlfcn.c22
3 files changed, 40 insertions, 17 deletions
diff --git a/crypto/dso/dso.h b/crypto/dso/dso.h
index add6858de8..8c495b1b24 100644
--- a/crypto/dso/dso.h
+++ b/crypto/dso/dso.h
@@ -81,12 +81,19 @@ extern "C" {
* DSO to prevent *any* native name-translation at all - eg. if the caller has
* prompted the user for a path to a driver library so the filename should be
* interpreted as-is. */
-#define DSO_FLAG_NO_NAME_TRANSLATION 0x01
+#define DSO_FLAG_NO_NAME_TRANSLATION 0x01
+/* An extra flag to give if only the extension should be added as
+ * translation. This is obviously only of importance on Unix and
+ * other operating systems where the translation also may prefix
+ * the name with something, like 'lib', and ignored everywhere else.
+ * This flag is also ignored if DSO_FLAG_NO_NAME_TRANSLATION is used
+ * at the same time. */
+#define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02
/* The following flag controls the translation of symbol names to upper
* case. This is currently only being implemented for OpenVMS.
*/
-#define DSO_FLAG_UPCASE_SYMBOL 0x02
+#define DSO_FLAG_UPCASE_SYMBOL 0x10
typedef void (*DSO_FUNC_TYPE)(void);
@@ -182,6 +189,7 @@ int DSO_free(DSO *dso);
int DSO_flags(DSO *dso);
int DSO_up(DSO *dso);
long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg);
+
/* This function sets the DSO's name_converter callback. If it is non-NULL,
* then it will be used instead of the associated DSO_METHOD's function. If
* oldcb is non-NULL then it is set to the function pointer value being
diff --git a/crypto/dso/dso_dl.c b/crypto/dso/dso_dl.c
index 6dd1b19755..43078604af 100644
--- a/crypto/dso/dso_dl.c
+++ b/crypto/dso/dso_dl.c
@@ -240,16 +240,18 @@ static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname)
static char *dl_name_converter(DSO *dso, const char *filename)
{
char *translated;
- int len, transform;
+ int len, rsize, transform;
len = strlen(filename);
+ rsize = len + 1;
transform = (strstr(filename, "/") == NULL);
- if(transform)
- /* We will convert this to "lib%s.so" */
- translated = OPENSSL_malloc(len + 7);
- else
- /* We will simply duplicate filename */
- translated = OPENSSL_malloc(len + 1);
+ {
+ /* We will convert this to "%s.so" or "lib%s.so" */
+ rsize += 3; /* The length of ".so" */
+ if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
+ rsize += 3; /* The length of "lib" */
+ }
+ translated = OPENSSL_malloc(rsize);
if(translated == NULL)
{
DSOerr(DSO_F_DL_NAME_CONVERTER,
@@ -257,7 +259,12 @@ static char *dl_name_converter(DSO *dso, const char *filename)
return(NULL);
}
if(transform)
- sprintf(translated, "lib%s.so", filename);
+ {
+ if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
+ sprintf(translated, "lib%s.so", filename);
+ else
+ sprintf(translated, "%s.so", filename);
+ }
else
sprintf(translated, "%s", filename);
return(translated);
diff --git a/crypto/dso/dso_dlfcn.c b/crypto/dso/dso_dlfcn.c
index 279b37b0c8..22e5059dd8 100644
--- a/crypto/dso/dso_dlfcn.c
+++ b/crypto/dso/dso_dlfcn.c
@@ -252,16 +252,19 @@ static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname)
static char *dlfcn_name_converter(DSO *dso, const char *filename)
{
char *translated;
- int len, transform;
+ int len, rsize, transform;
len = strlen(filename);
+ rsize = len + 1;
transform = (strstr(filename, "/") == NULL);
if(transform)
- /* We will convert this to "lib%s.so" */
- translated = OPENSSL_malloc(len + 7);
- else
- /* We will simply duplicate filename */
- translated = OPENSSL_malloc(len + 1);
+ {
+ /* We will convert this to "%s.so" or "lib%s.so" */
+ rsize += 3; /* The length of ".so" */
+ if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
+ rsize += 3; /* The length of "lib" */
+ }
+ translated = OPENSSL_malloc(rsize);
if(translated == NULL)
{
DSOerr(DSO_F_DLFCN_NAME_CONVERTER,
@@ -269,7 +272,12 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename)
return(NULL);
}
if(transform)
- sprintf(translated, "lib%s.so", filename);
+ {
+ if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
+ sprintf(translated, "lib%s.so", filename);
+ else
+ sprintf(translated, "%s.so", filename);
+ }
else
sprintf(translated, "%s", filename);
return(translated);