aboutsummaryrefslogtreecommitdiff
path: root/libssh/packet.c
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2006-11-12 00:57:48 +0000
committerAris Adamantiadis <aris@0xbadc0de.be>2006-11-12 00:57:48 +0000
commitff273b26b366c1aa2502b3a9828b256cc8d04a06 (patch)
tree00176cf184e0ff22c427ae38768a35b694d918ef /libssh/packet.c
parent4442e0e26206a1242a0a9268de5e2731c439e34e (diff)
downloadlibssh-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.c21
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)