diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2009-09-04 19:01:50 +0300 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2009-09-13 14:03:34 +0300 |
commit | 7fed54b1e574779dac61aafec6343a47bb116493 (patch) | |
tree | ba71339e6b7a0a344d833a6a08c1adb8a5ef4fad /libssh/scp.c | |
parent | d5840aa1f0ec98937d3d977851637c45a86d6a54 (diff) | |
download | libssh-7fed54b1e574779dac61aafec6343a47bb116493.tar.gz libssh-7fed54b1e574779dac61aafec6343a47bb116493.tar.xz libssh-7fed54b1e574779dac61aafec6343a47bb116493.zip |
Fix scp pull bug + scp logging
Diffstat (limited to 'libssh/scp.c')
-rw-r--r-- | libssh/scp.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/libssh/scp.c b/libssh/scp.c index 40c11e66..3ddbdd3a 100644 --- a/libssh/scp.c +++ b/libssh/scp.c @@ -85,11 +85,15 @@ int ssh_scp_init(ssh_scp scp){ scp->state=SSH_SCP_ERROR; return SSH_ERROR; } - r=channel_read(scp->channel,&code,1,0); - if(code != 0){ - ssh_set_error(scp->session,SSH_FATAL, "scp status code %ud not valid", code); - scp->state=SSH_SCP_ERROR; - return SSH_ERROR; + if(scp->mode == SSH_SCP_WRITE){ + r=channel_read(scp->channel,&code,1,0); + if(code != 0){ + ssh_set_error(scp->session,SSH_FATAL, "scp status code %ud not valid", code); + scp->state=SSH_SCP_ERROR; + return SSH_ERROR; + } + } else { + channel_write(scp->channel,"",1); } if(scp->mode == SSH_SCP_WRITE) scp->state=SSH_SCP_WRITE_INITED; @@ -328,6 +332,10 @@ int ssh_scp_pull_request(ssh_scp scp){ err=ssh_scp_read_string(scp,buffer,sizeof(buffer)); if(err==SSH_ERROR) return err; + p=strchr(buffer,'\n'); + if(p!=NULL) + *p='\0'; + ssh_log(scp->session,SSH_LOG_PROTOCOL,"Received SCP request: '%s'",buffer); switch(buffer[0]){ case 'C': /* File */ @@ -347,12 +355,7 @@ int ssh_scp_pull_request(ssh_scp scp){ *p=0; size=strtoull(tmp,NULL,10); p++; - tmp=p; - p=strchr(p,'\n'); - if(p==NULL) - goto error; - *p=0; - name=strdup(tmp); + name=strdup(p); SAFE_FREE(scp->request_name); scp->request_name=name; if(buffer[0]=='C'){ @@ -368,6 +371,13 @@ int ssh_scp_pull_request(ssh_scp scp){ break; case 'T': /* Timestamp */ + break; + case 0x1: + ssh_set_error(scp->session,SSH_REQUEST_DENIED,"SCP: %s",&buffer[1]); + return SSH_ERROR; + case 0x2: + ssh_set_error(scp->session,SSH_FATAL,"SCP: %s",&buffer[1]); + return SSH_ERROR; default: ssh_set_error(scp->session,SSH_FATAL,"Unhandled message: %s",buffer); return SSH_ERROR; |