1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-11-27 13:21:11 +03:00

sftp: Correctly check for EOF else keep spinning if there is no data

This fixes an issue introduced with
dbf72ffba2

Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
Andreas Schneider
2016-10-07 13:36:58 +02:00
parent 83421c0e8c
commit f561e6bcb3

View File

@@ -322,10 +322,15 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
do { do {
// read from channel until 4 bytes have been read or an error occurs // read from channel until 4 bytes have been read or an error occurs
s=ssh_channel_read(sftp->channel, buffer+r, 4-r, 0); s=ssh_channel_read(sftp->channel, buffer+r, 4-r, 0);
if (s <= 0) { if (s < 0) {
ssh_buffer_free(packet->payload); goto error;
SAFE_FREE(packet); } else if (s == 0) {
return NULL; int is_eof;
is_eof = ssh_channel_is_eof(sftp->channel);
if (is_eof) {
goto error;
}
} else { } else {
r += s; r += s;
} }
@@ -333,17 +338,13 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
ssh_buffer_add_data(packet->payload, buffer, r); ssh_buffer_add_data(packet->payload, buffer, r);
if (ssh_buffer_get_u32(packet->payload, &tmp) != sizeof(uint32_t)) { if (ssh_buffer_get_u32(packet->payload, &tmp) != sizeof(uint32_t)) {
ssh_set_error(sftp->session, SSH_FATAL, "Short sftp packet!"); ssh_set_error(sftp->session, SSH_FATAL, "Short sftp packet!");
ssh_buffer_free(packet->payload); goto error;
SAFE_FREE(packet);
return NULL;
} }
r=ssh_channel_read(sftp->channel, buffer, 1, 0); r=ssh_channel_read(sftp->channel, buffer, 1, 0);
if (r <= 0) { if (r <= 0) {
/* TODO: check if there are cases where an error needs to be set here */ /* TODO: check if there are cases where an error needs to be set here */
ssh_buffer_free(packet->payload); goto error;
SAFE_FREE(packet);
return NULL;
} }
ssh_buffer_add_data(packet->payload, buffer, r); ssh_buffer_add_data(packet->payload, buffer, r);
ssh_buffer_get_u8(packet->payload, &packet->type); ssh_buffer_get_u8(packet->payload, &packet->type);
@@ -360,20 +361,20 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
if(r <= 0) { if(r <= 0) {
/* TODO: check if there are cases where an error needs to be set here */ /* TODO: check if there are cases where an error needs to be set here */
ssh_buffer_free(packet->payload); goto error;
SAFE_FREE(packet);
return NULL;
} }
if (ssh_buffer_add_data(packet->payload, buffer, r) == SSH_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); ssh_set_error_oom(sftp->session);
return NULL; goto error;
} }
size -= r; size -= r;
} }
return packet; return packet;
error:
ssh_buffer_free(packet->payload);
SAFE_FREE(packet);
return NULL;
} }
static void sftp_set_error(sftp_session sftp, int errnum) { static void sftp_set_error(sftp_session sftp, int errnum) {