aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2016-10-07 13:36:58 +0200
committerAndreas Schneider <asn@cryptomilk.org>2016-10-07 13:37:48 +0200
commit1b0bf852bef0acfde0825163a6d313a5654b1d74 (patch)
treea32b8acf82709e7b77e351293d546834b25b4058
parent2b3185ec296ef22cbf73987fadf4163b2ad326bf (diff)
downloadlibssh-1b0bf852bef0a.tar.gz
libssh-1b0bf852bef0a.tar.xz
libssh-1b0bf852bef0a.zip
sftp: Correctly check for EOF else keep spinning if there is no data
This fixes an issue introduced with dbf72ffba2ad5b5694cd55aa1a7ca99053d20386 Signed-off-by: Andreas Schneider <asn@cryptomilk.org> (cherry picked from commit f561e6bcb361999088fe377f750dbacbc5e0102f)
-rw-r--r--src/sftp.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/sftp.c b/src/sftp.c
index fa2d3f44..4b0bd7f2 100644
--- a/src/sftp.c
+++ b/src/sftp.c
@@ -334,10 +334,15 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
do {
// read from channel until 4 bytes have been read or an error occurs
s=ssh_channel_read(sftp->channel, buffer+r, 4-r, 0);
- if (s <= 0) {
- ssh_buffer_free(packet->payload);
- SAFE_FREE(packet);
- return NULL;
+ if (s < 0) {
+ goto error;
+ } else if (s == 0) {
+ int is_eof;
+
+ is_eof = ssh_channel_is_eof(sftp->channel);
+ if (is_eof) {
+ goto error;
+ }
} else {
r += s;
}
@@ -345,17 +350,13 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
ssh_buffer_add_data(packet->payload, buffer, r);
if (buffer_get_u32(packet->payload, &tmp) != sizeof(uint32_t)) {
ssh_set_error(sftp->session, SSH_FATAL, "Short sftp packet!");
- ssh_buffer_free(packet->payload);
- SAFE_FREE(packet);
- return NULL;
+ goto error;
}
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);
- return NULL;
+ goto error;
}
ssh_buffer_add_data(packet->payload, buffer, r);
buffer_get_u8(packet->payload, &packet->type);
@@ -372,20 +373,20 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
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);
- return NULL;
+ goto error;
}
if (ssh_buffer_add_data(packet->payload, buffer, r) == SSH_ERROR) {
- ssh_buffer_free(packet->payload);
- SAFE_FREE(packet);
ssh_set_error_oom(sftp->session);
- return NULL;
+ goto error;
}
size -= r;
}
return packet;
+error:
+ ssh_buffer_free(packet->payload);
+ SAFE_FREE(packet);
+ return NULL;
}
static void sftp_set_error(sftp_session sftp, int errnum) {