aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarek Majkowski <marek@popcount.org>2013-06-06 13:32:46 +0100
committerMarek Majkowski <marek@popcount.org>2013-06-06 13:32:46 +0100
commit68be3469c55ac1e4b8f2fecf2a82bcced7f949c8 (patch)
tree057c98ff606f56665049100bf21953a56dc808ec /src
parenta022930fda028aaf04c33eba3b3ae0f85f22526b (diff)
downloadtor-68be3469c55ac1e4b8f2fecf2a82bcced7f949c8.tar
tor-68be3469c55ac1e4b8f2fecf2a82bcced7f949c8.tar.gz
Bug 5170 - simplify i2d_PublicKey in pkey_eq
Diffstat (limited to 'src')
-rw-r--r--src/common/tortls.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c
index 0773068a4..fd0a4107d 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -986,21 +986,19 @@ pkey_eq(EVP_PKEY *a, EVP_PKEY *b)
/* We'd like to do this, but openssl 0.9.7 doesn't have it:
return EVP_PKEY_cmp(a,b) == 1;
*/
- unsigned char *a_enc=NULL, *b_enc=NULL, *a_ptr, *b_ptr;
- int a_len1, b_len1, a_len2, b_len2, result;
- a_len1 = i2d_PublicKey(a, NULL);
- b_len1 = i2d_PublicKey(b, NULL);
- if (a_len1 != b_len1)
- return 0;
- a_ptr = a_enc = tor_malloc(a_len1);
- b_ptr = b_enc = tor_malloc(b_len1);
- a_len2 = i2d_PublicKey(a, &a_ptr);
- b_len2 = i2d_PublicKey(b, &b_ptr);
- tor_assert(a_len2 == a_len1);
- tor_assert(b_len2 == b_len1);
- result = tor_memeq(a_enc, b_enc, a_len1);
- tor_free(a_enc);
- tor_free(b_enc);
+ unsigned char *a_enc = NULL, *b_enc = NULL;
+ int a_len, b_len, result;
+ a_len = i2d_PublicKey(a, &a_enc);
+ b_len = i2d_PublicKey(b, &b_enc);
+ if (a_len != b_len || a_len < 0) {
+ result = 0;
+ } else {
+ result = tor_memeq(a_enc, b_enc, a_len);
+ }
+ if (a_enc)
+ OPENSSL_free(a_enc);
+ if (b_enc)
+ OPENSSL_free(b_enc);
return result;
}