summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-17 18:26:59 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-17 18:26:59 +0000
commite85b16ae49578cc8501b98c323c7658533478e81 (patch)
treefbf6f45d1208c1cdcad1b1f7dfe7a6a503b36f81
parenta925c266ca624863f343d46bc4e14efaa1d761f1 (diff)
downloadlibssh-e85b16ae49578cc8501b98c323c7658533478e81.tar.gz
libssh-e85b16ae49578cc8501b98c323c7658533478e81.tar.xz
libssh-e85b16ae49578cc8501b98c323c7658533478e81.zip
Don't leak memory in error path.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@530 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r--libssh/dh.c14
-rw-r--r--libssh/keys.c5
2 files changed, 13 insertions, 6 deletions
diff --git a/libssh/dh.c b/libssh/dh.c
index 619a4d2..bb22fcf 100644
--- a/libssh/dh.c
+++ b/libssh/dh.c
@@ -72,7 +72,7 @@ static unsigned char p_value[] = {
static unsigned long g_int = 2 ; /* G is defined as 2 by the ssh2 standards */
static bignum g;
static bignum p;
-static int ssh_crypto_inited=0;
+static unsigned int ssh_crypto_initialized_ref_count = 0;
int ssh_get_random(void *where, int len, int strong){
@@ -101,7 +101,7 @@ int ssh_get_random(void *where, int len, int strong){
* FIXME: Make the function thread safe by adding a semaphore or mutex.
*/
int ssh_crypto_init(void) {
- if (ssh_crypto_inited == 0) {
+ if (ssh_crypto_initialized_ref_count == 0) {
#ifdef HAVE_LIBGCRYPT
gcry_check_version(NULL);
@@ -134,19 +134,23 @@ int ssh_crypto_init(void) {
bignum_bin2bn(p_value, P_LEN, p);
OpenSSL_add_all_algorithms();
#endif
- ssh_crypto_inited++;
}
+ ssh_crypto_initialized_ref_count++;
+
return 0;
}
void ssh_crypto_finalize(void) {
- if(ssh_crypto_inited) {
+ if (ssh_crypto_initialized_ref_count) {
+ ssh_crypto_initialized_ref_count--;
+ }
+
+ if (ssh_crypto_initialized_ref_count == 0) {
bignum_free(g);
g = NULL;
bignum_free(p);
p = NULL;
- ssh_crypto_inited = 0;
}
}
diff --git a/libssh/keys.c b/libssh/keys.c
index 04ddcd0..d25cda3 100644
--- a/libssh/keys.c
+++ b/libssh/keys.c
@@ -75,6 +75,7 @@ PUBLIC_KEY *publickey_make_dss(SSH_SESSION *session, BUFFER *buffer) {
key = malloc(sizeof(PUBLIC_KEY));
if (key == NULL) {
+ buffer_free(buffer);
return NULL;
}
@@ -148,7 +149,7 @@ error:
string_free(pubkey);
publickey_free(key);
- return key;
+ return NULL;
}
PUBLIC_KEY *publickey_make_rsa(SSH_SESSION *session, BUFFER *buffer,
@@ -159,6 +160,7 @@ PUBLIC_KEY *publickey_make_rsa(SSH_SESSION *session, BUFFER *buffer,
key = malloc(sizeof(PUBLIC_KEY));
if (key == NULL) {
+ buffer_free(buffer);
return NULL;
}
@@ -171,6 +173,7 @@ PUBLIC_KEY *publickey_make_rsa(SSH_SESSION *session, BUFFER *buffer,
key->type_c = type;
e = buffer_get_ssh_string(buffer);
n = buffer_get_ssh_string(buffer);
+
buffer_free(buffer); /* we don't need it anymore */
if(e == NULL || n == NULL) {