aboutsummaryrefslogtreecommitdiff
path: root/libssh/scp.c
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2009-09-04 19:01:50 +0300
committerAris Adamantiadis <aris@0xbadc0de.be>2009-09-13 14:03:34 +0300
commit7fed54b1e574779dac61aafec6343a47bb116493 (patch)
treeba71339e6b7a0a344d833a6a08c1adb8a5ef4fad /libssh/scp.c
parentd5840aa1f0ec98937d3d977851637c45a86d6a54 (diff)
downloadlibssh-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.c32
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;