summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/dso/dso_vms.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/crypto/dso/dso_vms.c b/crypto/dso/dso_vms.c
index 1230a2c793..dd7402bfa2 100644
--- a/crypto/dso/dso_vms.c
+++ b/crypto/dso/dso_vms.c
@@ -453,11 +453,37 @@ static char *vms_merger(DSO *dso, const char *filespec1,
static char *vms_name_converter(DSO *dso, const char *filename)
{
- int len = strlen(filename);
- char *not_translated = OPENSSL_malloc(len + 1);
- if (not_translated != NULL)
- strcpy(not_translated, filename);
- return not_translated;
+ char *translated;
+ int len, transform;
+ const char *p;
+
+ len = strlen(filename);
+
+ p = strchr(filename, ':');
+ if (p != NULL) {
+ transform = 0;
+ } else {
+ p = filename;
+ transform = (strrchr(p, '>') == NULL && strrchr(p, ']') == NULL);
+ }
+
+ if (transform) {
+ int rsize = len + sizeof(DSO_EXTENSION);
+
+ if ((translated = OPENSSL_malloc(rsize)) != NULL) {
+ p = strrchr(filename, ';');
+ if (p != NULL)
+ len = p - filename;
+ strncpy(translated, filename, len);
+ translated[len] = '\0';
+ strcat(translated, DSO_EXTENSION);
+ if (p != NULL)
+ strcat(translated, p);
+ }
+ } else {
+ translated = OPENSSL_strdup(filename);
+ }
+ return translated;
}
#endif /* OPENSSL_SYS_VMS */