diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2006-11-12 00:57:48 +0000 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2006-11-12 00:57:48 +0000 |
commit | ff273b26b366c1aa2502b3a9828b256cc8d04a06 (patch) | |
tree | 00176cf184e0ff22c427ae38768a35b694d918ef /libssh/packet.c | |
parent | 4442e0e26206a1242a0a9268de5e2731c439e34e (diff) | |
download | libssh-ff273b26b366c1aa2502b3a9828b256cc8d04a06.tar.gz libssh-ff273b26b366c1aa2502b3a9828b256cc8d04a06.tar.xz libssh-ff273b26b366c1aa2502b3a9828b256cc8d04a06.zip |
oops, forgot to verify that it compiled fine
also, published changes from Norbert including lots of session->fd checks
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@81 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/packet.c')
-rw-r--r-- | libssh/packet.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/libssh/packet.c b/libssh/packet.c index b653bb6..900671d 100644 --- a/libssh/packet.c +++ b/libssh/packet.c @@ -39,6 +39,8 @@ static int completeread(int fd, void *buffer, int len){ int r; int total=0; int toread=len; + if(fd<0) + return SSH_ERROR; while((r=read(fd,buffer+total,toread))){ if(r==-1) return SSH_ERROR; @@ -76,6 +78,7 @@ static int socket_read(SSH_SESSION *session,int len){ (r==0)?"Connection closed by remote host" : "Error reading socket"); close(session->fd); session->fd=-1; + session->alive=0; session->data_except=1; return SSH_ERROR; } @@ -91,7 +94,10 @@ static int socket_read(SSH_SESSION *session,int len){ return SSH_AGAIN; session->data_to_read=0; /* read as much as we can */ - r=read(session->fd,buffer,sizeof(buffer)); + if(session->fd>0) + r=read(session->fd,buffer,sizeof(buffer)); + else + r=-1; if(r<=0){ ssh_set_error(session,SSH_FATAL, (r==0)?"Connection closed by remote host" : "Error reading socket"); @@ -335,6 +341,8 @@ int packet_translate(SSH_SESSION *session){ static int atomic_write(int fd, void *buffer, int len){ int written; + if(fd<0) + return SSH_ERROR; while(len >0) { written=write(fd,buffer,len); if(written==0 || written==-1) @@ -352,9 +360,12 @@ static int packet_nonblocking_flush(SSH_SESSION *session){ int w; ssh_fd_poll(session,&can_write,&except); /* internally sets data_to_write */ while(session->data_to_write && buffer_get_rest_len(session->out_socket_buffer)>0){ - w=write(session->fd,buffer_get_rest(session->out_socket_buffer), + if(session->fd<0){ + w=write(session->fd,buffer_get_rest(session->out_socket_buffer), buffer_get_rest_len(session->out_socket_buffer)); - session->data_to_write=0; + session->data_to_write=0; + } else + w=-1; /* write failed */ if(w<0){ session->data_to_write=0; session->data_except=1; @@ -376,6 +387,10 @@ static int packet_nonblocking_flush(SSH_SESSION *session){ /* blocking packet flush */ static int packet_blocking_flush(SSH_SESSION *session){ + if(session->fd<0) { + session->alive=0; + return SSH_ERROR; + } if(session->data_except) return SSH_ERROR; if(buffer_get_rest(session->out_socket_buffer)==0) |