diff options
Diffstat (limited to 'src/lib/libcrypto/dso/dso_dlfcn.c')
-rw-r--r-- | src/lib/libcrypto/dso/dso_dlfcn.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/lib/libcrypto/dso/dso_dlfcn.c b/src/lib/libcrypto/dso/dso_dlfcn.c index f734c1c6b7..656cd496f8 100644 --- a/src/lib/libcrypto/dso/dso_dlfcn.c +++ b/src/lib/libcrypto/dso/dso_dlfcn.c | |||
@@ -269,6 +269,7 @@ static char *dlfcn_merger(DSO *dso, const char *filespec1, | |||
269 | const char *filespec2) | 269 | const char *filespec2) |
270 | { | 270 | { |
271 | char *merged; | 271 | char *merged; |
272 | size_t len; | ||
272 | 273 | ||
273 | if(!filespec1 && !filespec2) | 274 | if(!filespec1 && !filespec2) |
274 | { | 275 | { |
@@ -280,18 +281,20 @@ static char *dlfcn_merger(DSO *dso, const char *filespec1, | |||
280 | same goes if the second file specification is missing. */ | 281 | same goes if the second file specification is missing. */ |
281 | if (!filespec2 || filespec1[0] == '/') | 282 | if (!filespec2 || filespec1[0] == '/') |
282 | { | 283 | { |
283 | merged = OPENSSL_malloc(strlen(filespec1) + 1); | 284 | len = strlen(filespec1) + 1; |
285 | merged = OPENSSL_malloc(len); | ||
284 | if(!merged) | 286 | if(!merged) |
285 | { | 287 | { |
286 | DSOerr(DSO_F_DLFCN_MERGER, | 288 | DSOerr(DSO_F_DLFCN_MERGER, |
287 | ERR_R_MALLOC_FAILURE); | 289 | ERR_R_MALLOC_FAILURE); |
288 | return(NULL); | 290 | return(NULL); |
289 | } | 291 | } |
290 | strcpy(merged, filespec1); | 292 | strlcpy(merged, filespec1, len); |
291 | } | 293 | } |
292 | /* If the first file specification is missing, the second one rules. */ | 294 | /* If the first file specification is missing, the second one rules. */ |
293 | else if (!filespec1) | 295 | else if (!filespec1) |
294 | { | 296 | { |
297 | len = strlen(filespec2) + 1; | ||
295 | merged = OPENSSL_malloc(strlen(filespec2) + 1); | 298 | merged = OPENSSL_malloc(strlen(filespec2) + 1); |
296 | if(!merged) | 299 | if(!merged) |
297 | { | 300 | { |
@@ -299,7 +302,7 @@ static char *dlfcn_merger(DSO *dso, const char *filespec1, | |||
299 | ERR_R_MALLOC_FAILURE); | 302 | ERR_R_MALLOC_FAILURE); |
300 | return(NULL); | 303 | return(NULL); |
301 | } | 304 | } |
302 | strcpy(merged, filespec2); | 305 | strlcpy(merged, filespec2, len); |
303 | } | 306 | } |
304 | else | 307 | else |
305 | /* This part isn't as trivial as it looks. It assumes that | 308 | /* This part isn't as trivial as it looks. It assumes that |
@@ -325,9 +328,9 @@ static char *dlfcn_merger(DSO *dso, const char *filespec1, | |||
325 | ERR_R_MALLOC_FAILURE); | 328 | ERR_R_MALLOC_FAILURE); |
326 | return(NULL); | 329 | return(NULL); |
327 | } | 330 | } |
328 | strcpy(merged, filespec2); | 331 | strlcpy(merged, filespec2, len + 2); |
329 | merged[spec2len] = '/'; | 332 | merged[spec2len] = '/'; |
330 | strcpy(&merged[spec2len + 1], filespec1); | 333 | strlcpy(&merged[spec2len + 1], filespec1, len + 1 - spec2len); |
331 | } | 334 | } |
332 | return(merged); | 335 | return(merged); |
333 | } | 336 | } |