diff options
Diffstat (limited to 'src/lib/libcrypto/x509/x509_vpm.c')
| -rw-r--r-- | src/lib/libcrypto/x509/x509_vpm.c | 69 |
1 files changed, 42 insertions, 27 deletions
diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c index 0897137697..baebcf7bca 100644 --- a/src/lib/libcrypto/x509/x509_vpm.c +++ b/src/lib/libcrypto/x509/x509_vpm.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: x509_vpm.c,v 1.17 2018/03/22 15:54:46 beck Exp $ */ | 1 | /* $OpenBSD: x509_vpm.c,v 1.18 2018/04/06 07:08:20 beck Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2004. | 3 | * project 2004. |
| 4 | */ | 4 | */ |
| @@ -125,7 +125,7 @@ sk_deep_copy(void *sk_void, void *copy_func_void, void *free_func_void) | |||
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | static int | 127 | static int |
| 128 | int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode, | 128 | x509_param_set_hosts_internal(X509_VERIFY_PARAM_ID *id, int mode, |
| 129 | const char *name, size_t namelen) | 129 | const char *name, size_t namelen) |
| 130 | { | 130 | { |
| 131 | char *copy; | 131 | char *copy; |
| @@ -134,7 +134,6 @@ int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode, | |||
| 134 | namelen = strlen(name); | 134 | namelen = strlen(name); |
| 135 | /* | 135 | /* |
| 136 | * Refuse names with embedded NUL bytes. | 136 | * Refuse names with embedded NUL bytes. |
| 137 | * XXX: Do we need to push an error onto the error stack? | ||
| 138 | */ | 137 | */ |
| 139 | if (name && memchr(name, '\0', namelen)) | 138 | if (name && memchr(name, '\0', namelen)) |
| 140 | return 0; | 139 | return 0; |
| @@ -197,6 +196,7 @@ x509_verify_param_zero(X509_VERIFY_PARAM *param) | |||
| 197 | free(paramid->ip); | 196 | free(paramid->ip); |
| 198 | paramid->ip = NULL; | 197 | paramid->ip = NULL; |
| 199 | paramid->iplen = 0; | 198 | paramid->iplen = 0; |
| 199 | paramid->poisoned = 0; | ||
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | X509_VERIFY_PARAM * | 202 | X509_VERIFY_PARAM * |
| @@ -367,24 +367,28 @@ X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, const X509_VERIFY_PARAM *from) | |||
| 367 | } | 367 | } |
| 368 | 368 | ||
| 369 | static int | 369 | static int |
| 370 | int_x509_param_set1(char **pdest, size_t *pdestlen, const char *src, | 370 | x509_param_set1_internal(char **pdest, size_t *pdestlen, const char *src, |
| 371 | size_t srclen) | 371 | size_t srclen, int nonul) |
| 372 | { | 372 | { |
| 373 | char *tmp; | 373 | char *tmp; |
| 374 | if (src) { | 374 | |
| 375 | if (srclen == 0) { | 375 | if (src == NULL) |
| 376 | if ((tmp = strdup(src)) == NULL) | 376 | return 0; |
| 377 | return 0; | 377 | |
| 378 | srclen = strlen(src); | 378 | if (srclen == 0) { |
| 379 | } else { | 379 | srclen = strlen(src); |
| 380 | if ((tmp = malloc(srclen)) == NULL) | 380 | if (srclen == 0) |
| 381 | return 0; | 381 | return 0; |
| 382 | memcpy(tmp, src, srclen); | 382 | if ((tmp = strdup(src)) == NULL) |
| 383 | } | 383 | return 0; |
| 384 | } else { | 384 | } else { |
| 385 | tmp = NULL; | 385 | if (nonul && memchr(src, '\0', srclen)) |
| 386 | srclen = 0; | 386 | return 0; |
| 387 | if ((tmp = malloc(srclen)) == NULL) | ||
| 388 | return 0; | ||
| 389 | memcpy(tmp, src, srclen); | ||
| 387 | } | 390 | } |
| 391 | |||
| 388 | if (*pdest) | 392 | if (*pdest) |
| 389 | free(*pdest); | 393 | free(*pdest); |
| 390 | *pdest = tmp; | 394 | *pdest = tmp; |
| @@ -505,14 +509,20 @@ int | |||
| 505 | X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, | 509 | X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, |
| 506 | const char *name, size_t namelen) | 510 | const char *name, size_t namelen) |
| 507 | { | 511 | { |
| 508 | return int_x509_param_set_hosts(param->id, SET_HOST, name, namelen); | 512 | if (x509_param_set_hosts_internal(param->id, SET_HOST, name, namelen)) |
| 513 | return 1; | ||
| 514 | param->id->poisoned = 1; | ||
| 515 | return 0; | ||
| 509 | } | 516 | } |
| 510 | 517 | ||
| 511 | int | 518 | int |
| 512 | X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, | 519 | X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, |
| 513 | const char *name, size_t namelen) | 520 | const char *name, size_t namelen) |
| 514 | { | 521 | { |
| 515 | return int_x509_param_set_hosts(param->id, ADD_HOST, name, namelen); | 522 | if (x509_param_set_hosts_internal(param->id, ADD_HOST, name, namelen)) |
| 523 | return 1; | ||
| 524 | param->id->poisoned = 1; | ||
| 525 | return 0; | ||
| 516 | } | 526 | } |
| 517 | 527 | ||
| 518 | void | 528 | void |
| @@ -531,18 +541,25 @@ int | |||
| 531 | X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, | 541 | X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, |
| 532 | size_t emaillen) | 542 | size_t emaillen) |
| 533 | { | 543 | { |
| 534 | return int_x509_param_set1(¶m->id->email, ¶m->id->emaillen, | 544 | if (x509_param_set1_internal(¶m->id->email, ¶m->id->emaillen, |
| 535 | email, emaillen); | 545 | email, emaillen, 1)) |
| 546 | return 1; | ||
| 547 | param->id->poisoned = 1; | ||
| 548 | return 0; | ||
| 536 | } | 549 | } |
| 537 | 550 | ||
| 538 | int | 551 | int |
| 539 | X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip, | 552 | X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip, |
| 540 | size_t iplen) | 553 | size_t iplen) |
| 541 | { | 554 | { |
| 542 | if (iplen != 0 && iplen != 4 && iplen != 16) | 555 | if (iplen != 4 && iplen != 16) |
| 543 | return 0; | 556 | goto err; |
| 544 | return int_x509_param_set1((char **)¶m->id->ip, ¶m->id->iplen, | 557 | if (x509_param_set1_internal((char **)¶m->id->ip, ¶m->id->iplen, |
| 545 | (char *)ip, iplen); | 558 | (char *)ip, iplen, 0)) |
| 559 | return 1; | ||
| 560 | err: | ||
| 561 | param->id->poisoned = 1; | ||
| 562 | return 0; | ||
| 546 | } | 563 | } |
| 547 | 564 | ||
| 548 | int | 565 | int |
| @@ -552,8 +569,6 @@ X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, const char *ipasc) | |||
| 552 | size_t iplen; | 569 | size_t iplen; |
| 553 | 570 | ||
| 554 | iplen = (size_t)a2i_ipadd(ipout, ipasc); | 571 | iplen = (size_t)a2i_ipadd(ipout, ipasc); |
| 555 | if (iplen == 0) | ||
| 556 | return 0; | ||
| 557 | return X509_VERIFY_PARAM_set1_ip(param, ipout, iplen); | 572 | return X509_VERIFY_PARAM_set1_ip(param, ipout, iplen); |
| 558 | } | 573 | } |
| 559 | 574 | ||
