diff options
| author | miod <> | 2015-02-15 08:44:35 +0000 |
|---|---|---|
| committer | miod <> | 2015-02-15 08:44:35 +0000 |
| commit | c6eb3f8c9d385d5eea6e7ce1ea2b6dae6e492e69 (patch) | |
| tree | 13797364656db3e3c63ac9fb0b1b16944e210ba3 /src | |
| parent | febdb24220fcb0cc63a37b757d06f4e264612b05 (diff) | |
| download | openbsd-c6eb3f8c9d385d5eea6e7ce1ea2b6dae6e492e69.tar.gz openbsd-c6eb3f8c9d385d5eea6e7ce1ea2b6dae6e492e69.tar.bz2 openbsd-c6eb3f8c9d385d5eea6e7ce1ea2b6dae6e492e69.zip | |
In ec_wNAF_mul(), move the declaration of tmp_wNAF higher in scope, so that
all the function's exit paths can make sure it gets freed. Coverity CID 78861
tweaks & ok doug@ jsing@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/ec/ec_mult.c | 11 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/ec/ec_mult.c | 11 |
2 files changed, 10 insertions, 12 deletions
diff --git a/src/lib/libcrypto/ec/ec_mult.c b/src/lib/libcrypto/ec/ec_mult.c index e711413598..68f55cfcb3 100644 --- a/src/lib/libcrypto/ec/ec_mult.c +++ b/src/lib/libcrypto/ec/ec_mult.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_mult.c,v 1.17 2015/02/09 15:49:22 jsing Exp $ */ | 1 | /* $OpenBSD: ec_mult.c,v 1.18 2015/02/15 08:44:35 miod Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. | 3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -348,6 +348,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 348 | int r_is_at_infinity = 1; | 348 | int r_is_at_infinity = 1; |
| 349 | size_t *wsize = NULL; /* individual window sizes */ | 349 | size_t *wsize = NULL; /* individual window sizes */ |
| 350 | signed char **wNAF = NULL; /* individual wNAFs */ | 350 | signed char **wNAF = NULL; /* individual wNAFs */ |
| 351 | signed char *tmp_wNAF = NULL; | ||
| 351 | size_t *wNAF_len = NULL; | 352 | size_t *wNAF_len = NULL; |
| 352 | size_t max_len = 0; | 353 | size_t max_len = 0; |
| 353 | size_t num_val; | 354 | size_t num_val; |
| @@ -470,7 +471,6 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 470 | } | 471 | } |
| 471 | /* we have already generated a wNAF for 'scalar' */ | 472 | /* we have already generated a wNAF for 'scalar' */ |
| 472 | } else { | 473 | } else { |
| 473 | signed char *tmp_wNAF = NULL; | ||
| 474 | size_t tmp_len = 0; | 474 | size_t tmp_len = 0; |
| 475 | 475 | ||
| 476 | if (num_scalar != 0) { | 476 | if (num_scalar != 0) { |
| @@ -483,7 +483,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 483 | */ | 483 | */ |
| 484 | wsize[num] = pre_comp->w; | 484 | wsize[num] = pre_comp->w; |
| 485 | tmp_wNAF = compute_wNAF(scalar, wsize[num], &tmp_len); | 485 | tmp_wNAF = compute_wNAF(scalar, wsize[num], &tmp_len); |
| 486 | if (!tmp_wNAF) | 486 | if (tmp_wNAF == NULL) |
| 487 | goto err; | 487 | goto err; |
| 488 | 488 | ||
| 489 | if (tmp_len <= max_len) { | 489 | if (tmp_len <= max_len) { |
| @@ -497,6 +497,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 497 | totalnum = num + 1; /* don't use wNAF | 497 | totalnum = num + 1; /* don't use wNAF |
| 498 | * splitting */ | 498 | * splitting */ |
| 499 | wNAF[num] = tmp_wNAF; | 499 | wNAF[num] = tmp_wNAF; |
| 500 | tmp_wNAF = NULL; | ||
| 500 | wNAF[num + 1] = NULL; | 501 | wNAF[num + 1] = NULL; |
| 501 | wNAF_len[num] = tmp_len; | 502 | wNAF_len[num] = tmp_len; |
| 502 | if (tmp_len > max_len) | 503 | if (tmp_len > max_len) |
| @@ -553,7 +554,6 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 553 | wNAF[i] = malloc(wNAF_len[i]); | 554 | wNAF[i] = malloc(wNAF_len[i]); |
| 554 | if (wNAF[i] == NULL) { | 555 | if (wNAF[i] == NULL) { |
| 555 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); | 556 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); |
| 556 | free(tmp_wNAF); | ||
| 557 | goto err; | 557 | goto err; |
| 558 | } | 558 | } |
| 559 | memcpy(wNAF[i], pp, wNAF_len[i]); | 559 | memcpy(wNAF[i], pp, wNAF_len[i]); |
| @@ -562,14 +562,12 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 562 | 562 | ||
| 563 | if (*tmp_points == NULL) { | 563 | if (*tmp_points == NULL) { |
| 564 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_INTERNAL_ERROR); | 564 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_INTERNAL_ERROR); |
| 565 | free(tmp_wNAF); | ||
| 566 | goto err; | 565 | goto err; |
| 567 | } | 566 | } |
| 568 | val_sub[i] = tmp_points; | 567 | val_sub[i] = tmp_points; |
| 569 | tmp_points += pre_points_per_block; | 568 | tmp_points += pre_points_per_block; |
| 570 | pp += blocksize; | 569 | pp += blocksize; |
| 571 | } | 570 | } |
| 572 | free(tmp_wNAF); | ||
| 573 | } | 571 | } |
| 574 | } | 572 | } |
| 575 | } | 573 | } |
| @@ -686,6 +684,7 @@ err: | |||
| 686 | EC_POINT_free(tmp); | 684 | EC_POINT_free(tmp); |
| 687 | free(wsize); | 685 | free(wsize); |
| 688 | free(wNAF_len); | 686 | free(wNAF_len); |
| 687 | free(tmp_wNAF); | ||
| 689 | if (wNAF != NULL) { | 688 | if (wNAF != NULL) { |
| 690 | signed char **w; | 689 | signed char **w; |
| 691 | 690 | ||
diff --git a/src/lib/libssl/src/crypto/ec/ec_mult.c b/src/lib/libssl/src/crypto/ec/ec_mult.c index e711413598..68f55cfcb3 100644 --- a/src/lib/libssl/src/crypto/ec/ec_mult.c +++ b/src/lib/libssl/src/crypto/ec/ec_mult.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_mult.c,v 1.17 2015/02/09 15:49:22 jsing Exp $ */ | 1 | /* $OpenBSD: ec_mult.c,v 1.18 2015/02/15 08:44:35 miod Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. | 3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -348,6 +348,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 348 | int r_is_at_infinity = 1; | 348 | int r_is_at_infinity = 1; |
| 349 | size_t *wsize = NULL; /* individual window sizes */ | 349 | size_t *wsize = NULL; /* individual window sizes */ |
| 350 | signed char **wNAF = NULL; /* individual wNAFs */ | 350 | signed char **wNAF = NULL; /* individual wNAFs */ |
| 351 | signed char *tmp_wNAF = NULL; | ||
| 351 | size_t *wNAF_len = NULL; | 352 | size_t *wNAF_len = NULL; |
| 352 | size_t max_len = 0; | 353 | size_t max_len = 0; |
| 353 | size_t num_val; | 354 | size_t num_val; |
| @@ -470,7 +471,6 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 470 | } | 471 | } |
| 471 | /* we have already generated a wNAF for 'scalar' */ | 472 | /* we have already generated a wNAF for 'scalar' */ |
| 472 | } else { | 473 | } else { |
| 473 | signed char *tmp_wNAF = NULL; | ||
| 474 | size_t tmp_len = 0; | 474 | size_t tmp_len = 0; |
| 475 | 475 | ||
| 476 | if (num_scalar != 0) { | 476 | if (num_scalar != 0) { |
| @@ -483,7 +483,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 483 | */ | 483 | */ |
| 484 | wsize[num] = pre_comp->w; | 484 | wsize[num] = pre_comp->w; |
| 485 | tmp_wNAF = compute_wNAF(scalar, wsize[num], &tmp_len); | 485 | tmp_wNAF = compute_wNAF(scalar, wsize[num], &tmp_len); |
| 486 | if (!tmp_wNAF) | 486 | if (tmp_wNAF == NULL) |
| 487 | goto err; | 487 | goto err; |
| 488 | 488 | ||
| 489 | if (tmp_len <= max_len) { | 489 | if (tmp_len <= max_len) { |
| @@ -497,6 +497,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 497 | totalnum = num + 1; /* don't use wNAF | 497 | totalnum = num + 1; /* don't use wNAF |
| 498 | * splitting */ | 498 | * splitting */ |
| 499 | wNAF[num] = tmp_wNAF; | 499 | wNAF[num] = tmp_wNAF; |
| 500 | tmp_wNAF = NULL; | ||
| 500 | wNAF[num + 1] = NULL; | 501 | wNAF[num + 1] = NULL; |
| 501 | wNAF_len[num] = tmp_len; | 502 | wNAF_len[num] = tmp_len; |
| 502 | if (tmp_len > max_len) | 503 | if (tmp_len > max_len) |
| @@ -553,7 +554,6 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 553 | wNAF[i] = malloc(wNAF_len[i]); | 554 | wNAF[i] = malloc(wNAF_len[i]); |
| 554 | if (wNAF[i] == NULL) { | 555 | if (wNAF[i] == NULL) { |
| 555 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); | 556 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); |
| 556 | free(tmp_wNAF); | ||
| 557 | goto err; | 557 | goto err; |
| 558 | } | 558 | } |
| 559 | memcpy(wNAF[i], pp, wNAF_len[i]); | 559 | memcpy(wNAF[i], pp, wNAF_len[i]); |
| @@ -562,14 +562,12 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
| 562 | 562 | ||
| 563 | if (*tmp_points == NULL) { | 563 | if (*tmp_points == NULL) { |
| 564 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_INTERNAL_ERROR); | 564 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_INTERNAL_ERROR); |
| 565 | free(tmp_wNAF); | ||
| 566 | goto err; | 565 | goto err; |
| 567 | } | 566 | } |
| 568 | val_sub[i] = tmp_points; | 567 | val_sub[i] = tmp_points; |
| 569 | tmp_points += pre_points_per_block; | 568 | tmp_points += pre_points_per_block; |
| 570 | pp += blocksize; | 569 | pp += blocksize; |
| 571 | } | 570 | } |
| 572 | free(tmp_wNAF); | ||
| 573 | } | 571 | } |
| 574 | } | 572 | } |
| 575 | } | 573 | } |
| @@ -686,6 +684,7 @@ err: | |||
| 686 | EC_POINT_free(tmp); | 684 | EC_POINT_free(tmp); |
| 687 | free(wsize); | 685 | free(wsize); |
| 688 | free(wNAF_len); | 686 | free(wNAF_len); |
| 687 | free(tmp_wNAF); | ||
| 689 | if (wNAF != NULL) { | 688 | if (wNAF != NULL) { |
| 690 | signed char **w; | 689 | signed char **w; |
| 691 | 690 | ||
