diff options
author | miod <> | 2015-02-15 08:44:35 +0000 |
---|---|---|
committer | miod <> | 2015-02-15 08:44:35 +0000 |
commit | 59c2aa4c8fcca1f139983d0a015c7ec6b8c6e0e2 (patch) | |
tree | 13797364656db3e3c63ac9fb0b1b16944e210ba3 | |
parent | ee9535bf517cf372a14dd0af6721fbfaf4c74410 (diff) | |
download | openbsd-59c2aa4c8fcca1f139983d0a015c7ec6b8c6e0e2.tar.gz openbsd-59c2aa4c8fcca1f139983d0a015c7ec6b8c6e0e2.tar.bz2 openbsd-59c2aa4c8fcca1f139983d0a015c7ec6b8c6e0e2.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@
-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 | ||