diff options
Diffstat (limited to 'src/lib/libcrypto/dso/dso_dl.c')
| -rw-r--r-- | src/lib/libcrypto/dso/dso_dl.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/lib/libcrypto/dso/dso_dl.c b/src/lib/libcrypto/dso/dso_dl.c index fc4236bd9a..c3b4f6cf45 100644 --- a/src/lib/libcrypto/dso/dso_dl.c +++ b/src/lib/libcrypto/dso/dso_dl.c | |||
| @@ -259,18 +259,20 @@ static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2) | |||
| 259 | same goes if the second file specification is missing. */ | 259 | same goes if the second file specification is missing. */ |
| 260 | if (!filespec2 || filespec1[0] == '/') | 260 | if (!filespec2 || filespec1[0] == '/') |
| 261 | { | 261 | { |
| 262 | merged = OPENSSL_malloc(strlen(filespec1) + 1); | 262 | size_t len = strlen(filespec1) + 1; |
| 263 | merged = OPENSSL_malloc(len); | ||
| 263 | if(!merged) | 264 | if(!merged) |
| 264 | { | 265 | { |
| 265 | DSOerr(DSO_F_DL_MERGER, | 266 | DSOerr(DSO_F_DL_MERGER, |
| 266 | ERR_R_MALLOC_FAILURE); | 267 | ERR_R_MALLOC_FAILURE); |
| 267 | return(NULL); | 268 | return(NULL); |
| 268 | } | 269 | } |
| 269 | strcpy(merged, filespec1); | 270 | memcpy(merged, filespec1, len); |
| 270 | } | 271 | } |
| 271 | /* If the first file specification is missing, the second one rules. */ | 272 | /* If the first file specification is missing, the second one rules. */ |
| 272 | else if (!filespec1) | 273 | else if (!filespec1) |
| 273 | { | 274 | { |
| 275 | size_t len = strlen(filespec2) + 1; | ||
| 274 | merged = OPENSSL_malloc(strlen(filespec2) + 1); | 276 | merged = OPENSSL_malloc(strlen(filespec2) + 1); |
| 275 | if(!merged) | 277 | if(!merged) |
| 276 | { | 278 | { |
| @@ -278,7 +280,7 @@ static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2) | |||
| 278 | ERR_R_MALLOC_FAILURE); | 280 | ERR_R_MALLOC_FAILURE); |
| 279 | return(NULL); | 281 | return(NULL); |
| 280 | } | 282 | } |
| 281 | strcpy(merged, filespec2); | 283 | memcpy(merged, filespec2, len); |
| 282 | } | 284 | } |
| 283 | else | 285 | else |
| 284 | /* This part isn't as trivial as it looks. It assumes that | 286 | /* This part isn't as trivial as it looks. It assumes that |
| @@ -287,7 +289,7 @@ static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2) | |||
| 287 | the concatenation of filespec2 followed by a slash followed | 289 | the concatenation of filespec2 followed by a slash followed |
| 288 | by filespec1. */ | 290 | by filespec1. */ |
| 289 | { | 291 | { |
| 290 | int spec2len, len; | 292 | size_t spec2len, len; |
| 291 | 293 | ||
| 292 | spec2len = (filespec2 ? strlen(filespec2) : 0); | 294 | spec2len = (filespec2 ? strlen(filespec2) : 0); |
| 293 | len = spec2len + (filespec1 ? strlen(filespec1) : 0); | 295 | len = spec2len + (filespec1 ? strlen(filespec1) : 0); |
| @@ -304,9 +306,9 @@ static char *dl_merger(DSO *dso, const char *filespec1, const char *filespec2) | |||
| 304 | ERR_R_MALLOC_FAILURE); | 306 | ERR_R_MALLOC_FAILURE); |
| 305 | return(NULL); | 307 | return(NULL); |
| 306 | } | 308 | } |
| 307 | strcpy(merged, filespec2); | 309 | strlcpy(merged, filespec2, len + 2); |
| 308 | merged[spec2len] = '/'; | 310 | merged[spec2len] = '/'; |
| 309 | strcpy(&merged[spec2len + 1], filespec1); | 311 | strlcpy(&merged[spec2len + 1], filespec1, 1 + len - spec2len); |
| 310 | } | 312 | } |
| 311 | return(merged); | 313 | return(merged); |
| 312 | } | 314 | } |
