diff options
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/dso/dso_vms.c | 36 |
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 */ |