aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2008-03-03 14:51:35 +0000
committerAris Adamantiadis <aris@0xbadc0de.be>2008-03-03 14:51:35 +0000
commit01470097c6ff22b3c1a8c4383ae08a2ad3ce0ff8 (patch)
treecb0a7cd01ed647ca4c2d19e534556d48bba8cd57
parentfeccd44ef59329f3bfb8963e473a14e43e1aa2ec (diff)
downloadlibssh-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.h2
-rw-r--r--libssh/dh.c15
-rw-r--r--libssh/init.c1
-rw-r--r--libssh/session.c4
-rw-r--r--sample.c19
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)
diff --git a/sample.c b/sample.c
index 37af237d..9fef51ed 100644
--- a/sample.c
+++ b/sample.c
@@ -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");