diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-01 20:24:09 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-01 20:24:09 +0000 |
commit | 1b627b386763e22a7b8f7a7c8de9610c1da56cd2 (patch) | |
tree | 223b3322cb868ac2dfe89b2a6f00d92f6c34ba0b | |
parent | b06c167775ec3aac00ba52935c07ce4b1520721b (diff) | |
download | libssh-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
-rw-r--r-- | libssh/server.c | 8 | ||||
-rw-r--r-- | libssh/session.c | 5 | ||||
-rw-r--r-- | libssh/socket.c | 40 |
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 |