mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-04 12:20:42 +09:00
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
This commit is contained in:
14
libssh/dh.c
14
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user