summaryrefslogtreecommitdiffstats
path: root/libssh
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-01 20:24:09 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-01 20:24:09 +0000
commit1b627b386763e22a7b8f7a7c8de9610c1da56cd2 (patch)
tree223b3322cb868ac2dfe89b2a6f00d92f6c34ba0b /libssh
parentb06c167775ec3aac00ba52935c07ce4b1520721b (diff)
downloadlibssh-1b627b386763e22a7b8f7a7c8de9610c1da56cd2.tar.gz
libssh-1b627b386763e22a7b8f7a7c8de9610c1da56cd2.tar.xz
libssh-1b627b386763e22a7b8f7a7c8de9610c1da56cd2.zip
More memory error checks for ssh_socket_new().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@329 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh')
-rw-r--r--libssh/server.c8
-rw-r--r--libssh/session.c5
-rw-r--r--libssh/socket.c40
3 files changed, 37 insertions, 16 deletions
diff --git a/libssh/server.c b/libssh/server.c
index ef45e6a8..65903dee 100644
--- a/libssh/server.c
+++ b/libssh/server.c
@@ -186,6 +186,14 @@ SSH_SESSION *ssh_bind_accept(SSH_BIND *ssh_bind){
ssh_socket_free(session->socket);
session->socket=ssh_socket_new(session);
+ if (session->socket == NULL) {
+ if (dsa)
+ private_key_free(dsa);
+ if (rsa)
+ private_key_free(rsa);
+ ssh_cleanup(session);
+ return NULL;
+ }
ssh_socket_set_fd(session->socket,fd);
session->dsa_key=dsa;
session->rsa_key=rsa;
diff --git a/libssh/session.c b/libssh/session.c
index 1ba30d8d..6c88c6c2 100644
--- a/libssh/session.c
+++ b/libssh/session.c
@@ -44,7 +44,10 @@ SSH_SESSION *ssh_new(void) {
memset(session,0,sizeof(SSH_SESSION));
session->next_crypto=crypto_new();
session->maxchannel=FIRST_CHANNEL;
- session->socket=ssh_socket_new(session);
+ session->socket = ssh_socket_new(session);
+ if (session->socket == NULL) {
+ goto err;
+ }
session->alive=0;
session->auth_methods=0;
session->blocking=1;
diff --git a/libssh/socket.c b/libssh/socket.c
index 03797d61..0fe4ad52 100644
--- a/libssh/socket.c
+++ b/libssh/socket.c
@@ -88,22 +88,32 @@ void ssh_socket_init(void) {
* \internal
* \brief creates a new Socket object
*/
-struct socket *ssh_socket_new(SSH_SESSION *session){
- struct socket *s;
+struct socket *ssh_socket_new(SSH_SESSION *session) {
+ struct socket *s;
- s = malloc(sizeof(struct socket));
- if (s = NULL) {
- return NULL;
- }
- s->fd=-1;
- s->last_errno=-1;
- s->session=session;
- s->in_buffer=buffer_new();
- s->out_buffer=buffer_new();
- s->data_to_read=0;
- s->data_to_write=0;
- s->data_except=0;
- return s;
+ s = malloc(sizeof(struct socket));
+ if (s == NULL) {
+ return NULL;
+ }
+ s->fd = -1;
+ s->last_errno = -1;
+ s->session = session;
+ s->in_buffer = buffer_new();
+ if (s->in_buffer == NULL) {
+ SAFE_FREE(s);
+ return NULL;
+ }
+ s->out_buffer=buffer_new();
+ if (s->out_buffer == NULL) {
+ buffer_free(s->in_buffer);
+ SAFE_FREE(s);
+ return NULL;
+ }
+ s->data_to_read = 0;
+ s->data_to_write = 0;
+ s->data_except = 0;
+
+ return s;
}
/* \internal