diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2016-10-07 13:36:58 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2016-10-07 13:36:58 +0200 |
commit | f561e6bcb361999088fe377f750dbacbc5e0102f (patch) | |
tree | 4515ec26c52840d1d1ec41bbe458145eb722059f /src | |
parent | 83421c0e8cb30adfe9d459d74822a9bf7fdb99ba (diff) | |
download | libssh-f561e6bcb361999088fe377f750dbacbc5e0102f.tar.gz libssh-f561e6bcb361999088fe377f750dbacbc5e0102f.tar.xz libssh-f561e6bcb361999088fe377f750dbacbc5e0102f.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>
Diffstat (limited to 'src')
-rw-r--r-- | src/sftp.c | 33 |
1 files changed, 17 insertions, 16 deletions
@@ -322,10 +322,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; } @@ -333,17 +338,13 @@ sftp_packet sftp_packet_read(sftp_session sftp) { ssh_buffer_add_data(packet->payload, buffer, r); if (ssh_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); ssh_buffer_get_u8(packet->payload, &packet->type); @@ -360,20 +361,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) { |