diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-17 18:26:59 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-17 18:26:59 +0000 |
commit | e85b16ae49578cc8501b98c323c7658533478e81 (patch) | |
tree | fbf6f45d1208c1cdcad1b1f7dfe7a6a503b36f81 | |
parent | a925c266ca624863f343d46bc4e14efaa1d761f1 (diff) | |
download | libssh-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.c | 14 | ||||
-rw-r--r-- | libssh/keys.c | 5 |
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) { |