diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2008-03-03 14:51:35 +0000 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2008-03-03 14:51:35 +0000 |
commit | 01470097c6ff22b3c1a8c4383ae08a2ad3ce0ff8 (patch) | |
tree | cb0a7cd01ed647ca4c2d19e534556d48bba8cd57 | |
parent | feccd44ef59329f3bfb8963e473a14e43e1aa2ec (diff) | |
download | libssh-01470097c6ff22b3c1a8c4383ae08a2ad3ce0ff8.tar.gz libssh-01470097c6ff22b3c1a8c4383ae08a2ad3ce0ff8.tar.xz libssh-01470097c6ff22b3c1a8c4383ae08a2ad3ce0ff8.zip |
fix bug #0000002 : in_socket_buffer and out_socket_buffer memleak +
"g" and "p" O(1) memleak.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@134 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r-- | include/libssh/priv.h | 2 | ||||
-rw-r--r-- | libssh/dh.c | 15 | ||||
-rw-r--r-- | libssh/init.c | 1 | ||||
-rw-r--r-- | libssh/session.c | 4 | ||||
-rw-r--r-- | sample.c | 19 |
5 files changed, 27 insertions, 14 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h index 94e45c2a..5d90e642 100644 --- a/include/libssh/priv.h +++ b/include/libssh/priv.h @@ -441,7 +441,7 @@ void ssh_print_bignum(char *which,bignum num); void dh_generate_x(SSH_SESSION *session); void dh_generate_y(SSH_SESSION *session); void dh_generate_f(SSH_SESSION *session); - +void ssh_crypto_finalize(); STRING *dh_get_e(SSH_SESSION *session); STRING *dh_get_f(SSH_SESSION *session); void dh_import_f(SSH_SESSION *session,STRING *f_string); diff --git a/libssh/dh.c b/libssh/dh.c index 937ca6a4..a7f4e775 100644 --- a/libssh/dh.c +++ b/libssh/dh.c @@ -65,6 +65,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; /* maybe it might be enhanced .... */ /* XXX Do it. */ @@ -84,10 +85,10 @@ int ssh_get_random(void *where, int len, int strong){ } } + /* it inits the values g and p which are used for DH key agreement */ void ssh_crypto_init(){ - static int init=0; - if(!init){ + if(ssh_crypto_inited == 0){ #ifdef HAVE_LIBGCRYPT gcry_check_version(NULL); if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P,0)) @@ -105,10 +106,18 @@ void ssh_crypto_init(){ bignum_bin2bn(p_value,P_LEN,p); OpenSSL_add_all_algorithms(); #endif - init++; + ssh_crypto_inited++; } } +void ssh_crypto_finalize(){ + if(ssh_crypto_inited){ + bignum_free(g); + bignum_free(p); + ssh_crypto_inited=0; + } +} + /* prints the bignum on stderr */ void ssh_print_bignum(char *which,bignum num){ #ifdef HAVE_LIBGCRYPT diff --git a/libssh/init.c b/libssh/init.c index e7f27bc1..f1ae11f0 100644 --- a/libssh/init.c +++ b/libssh/init.c @@ -25,6 +25,7 @@ MA 02111-1307, USA. */ int ssh_finalize() { + ssh_crypto_finalize(); #ifdef HAVE_LIBGCRYPT gcry_control(GCRYCTL_TERM_SECMEM); #elif defined HAVE_LIBCRYPTO diff --git a/libssh/session.c b/libssh/session.c index bb7858ef..1f19640d 100644 --- a/libssh/session.c +++ b/libssh/session.c @@ -58,6 +58,10 @@ void ssh_cleanup(SSH_SESSION *session){ buffer_free(session->in_buffer); if(session->out_buffer) buffer_free(session->out_buffer); + if(session->in_socket_buffer) + buffer_free(session->in_socket_buffer); + if(session->out_socket_buffer) + buffer_free(session->out_socket_buffer); if(session->banner) free(session->banner); if(session->options) @@ -391,7 +391,7 @@ int main(int argc, char **argv){ if(ssh_connect(session)){ fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session)); ssh_disconnect(session); - ssh_finalize(); + ssh_finalize(); return 1; } state=ssh_is_server_known(session); @@ -404,16 +404,16 @@ int main(int argc, char **argv){ ssh_print_hexa("Public key hash",hash,MD5_DIGEST_LEN); fprintf(stderr,"For security reason, connection will be stopped\n"); ssh_disconnect(session); - ssh_finalize(); + ssh_finalize(); exit(-1); case SSH_SERVER_FOUND_OTHER: fprintf(stderr,"The host key for this server was not found but an other type of key exists.\n"); fprintf(stderr,"An attacker might change the default server key to confuse your client" "into thinking the key does not exist\n" "We advise you to rerun the client with -d or -r for more safety.\n"); - ssh_disconnect(session); - ssh_finalize(); - exit(-1); + ssh_disconnect(session); + ssh_finalize(); + exit(-1); case SSH_SERVER_NOT_KNOWN: fprintf(stderr,"The server is unknown. Do you trust the host key ?\n"); ssh_get_pubkey_hash(session,hash); @@ -434,7 +434,7 @@ int main(int argc, char **argv){ case SSH_SERVER_ERROR: fprintf(stderr,"%s",ssh_get_error(session)); ssh_disconnect(session); - ssh_finalize(); + ssh_finalize(); exit(-1); } @@ -442,7 +442,7 @@ int main(int argc, char **argv){ auth=ssh_userauth_autopubkey(session); if(auth==SSH_AUTH_ERROR){ fprintf(stderr,"Authenticating with pubkey: %s\n",ssh_get_error(session)); - ssh_finalize(); + ssh_finalize(); return -1; } banner=ssh_get_issue_banner(session); @@ -455,7 +455,7 @@ int main(int argc, char **argv){ if(auth==SSH_AUTH_ERROR){ fprintf(stderr,"authenticating with keyb-interactive: %s\n", ssh_get_error(session)); - ssh_finalize(); + ssh_finalize(); return -1; } } @@ -464,13 +464,12 @@ int main(int argc, char **argv){ if(ssh_userauth_password(session,NULL,password) != SSH_AUTH_SUCCESS){ fprintf(stderr,"Authentication failed: %s\n",ssh_get_error(session)); ssh_disconnect(session); - ssh_finalize(); + ssh_finalize(); return -1; } memset(password,0,strlen(password)); } ssh_say(1,"Authentication success\n"); - printf("%s\n",argv[0]); if(strstr(argv[0],"sftp")){ sftp=1; ssh_say(1,"doing sftp instead\n"); |