aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-10-01 21:41:56 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-10-01 21:41:56 +0200
commitc4e67730a3ac2c921420b068b7f72e0675a12c43 (patch)
tree5fc1bd381e95a64a4f40a75cd4902f882e0448ae
parent9f7e2c32524052b4b0e234b84195869d950943f9 (diff)
downloadlibssh-c4e67730a3ac2c921420b068b7f72e0675a12c43.tar.gz
libssh-c4e67730a3ac2c921420b068b7f72e0675a12c43.tar.xz
libssh-c4e67730a3ac2c921420b068b7f72e0675a12c43.zip
Convert sftp.c to ssh_channel_read
-rw-r--r--src/sftp.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/sftp.c b/src/sftp.c
index e5c91af3..8ea7e837 100644
--- a/src/sftp.c
+++ b/src/sftp.c
@@ -288,8 +288,10 @@ int sftp_packet_write(sftp_session sftp, uint8_t type, ssh_buffer payload){
}
sftp_packet sftp_packet_read(sftp_session sftp) {
+ unsigned char buffer[4096];
sftp_packet packet = NULL;
uint32_t size;
+ int r;
sftp_enter_function();
@@ -306,13 +308,14 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
return NULL;
}
- if (channel_read_buffer(sftp->channel, packet->payload, 4, 0) <= 0) {
+ r=ssh_channel_read(sftp->channel, buffer, 4, 0);
+ if (r < 0) {
ssh_buffer_free(packet->payload);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
-
+ buffer_add_data(packet->payload,buffer, r);
if (buffer_get_u32(packet->payload, &size) != sizeof(uint32_t)) {
ssh_set_error(sftp->session, SSH_FATAL, "Short sftp packet!");
ssh_buffer_free(packet->payload);
@@ -322,23 +325,36 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
}
size = ntohl(size);
- if (channel_read_buffer(sftp->channel, packet->payload, 1, 0) <= 0) {
+ r=ssh_channel_read(sftp->channel, buffer, 1, 0);
+ if (r <= 0) {
/* TODO: check if there are cases where an error needs to be set here */
ssh_buffer_free(packet->payload);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
-
+ buffer_add_data(packet->payload, buffer, r);
buffer_get_u8(packet->payload, &packet->type);
- if (size > 1) {
- if (channel_read_buffer(sftp->channel, packet->payload, size - 1, 0) <= 0) {
+ size=size-1;
+ while (size>0){
+ r=ssh_channel_read(sftp->channel,buffer,
+ sizeof(buffer)>size ? size:sizeof(buffer),0);
+
+ if(r <= 0) {
/* TODO: check if there are cases where an error needs to be set here */
ssh_buffer_free(packet->payload);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
+ if(buffer_add_data(packet->payload,buffer,r)==SSH_ERROR){
+ ssh_buffer_free(packet->payload);
+ SAFE_FREE(packet);
+ sftp_leave_function();
+ ssh_set_error_oom(sftp->session);
+ return NULL;
+ }
+ size -= r;
}
sftp_leave_function();