sftp: Use 's' only in the scope it is needed

This revaled a bug when reading the packet type.

Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
(cherry picked from commit 01135703a3)
This commit is contained in:
Andreas Schneider
2018-09-08 08:53:45 +02:00
parent dc587045bf
commit eb08802b7c

View File

@@ -332,7 +332,7 @@ sftp_packet sftp_packet_read(sftp_session sftp)
uint8_t buffer[SFTP_BUFFER_SIZE_MAX]; uint8_t buffer[SFTP_BUFFER_SIZE_MAX];
sftp_packet packet = sftp->read_packet; sftp_packet packet = sftp->read_packet;
uint32_t size; uint32_t size;
int r, s, is_eof; int nread, is_eof;
int rc; int rc;
packet->sftp = sftp; packet->sftp = sftp;
@@ -343,10 +343,12 @@ sftp_packet sftp_packet_read(sftp_session sftp)
return NULL; return NULL;
} }
r = 0; nread = 0;
do { do {
int s;
// 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 + nread, 4 - nread, 0);
if (s < 0) { if (s < 0) {
goto error; goto error;
} else if (s == 0) { } else if (s == 0) {
@@ -355,9 +357,9 @@ sftp_packet sftp_packet_read(sftp_session sftp)
goto error; goto error;
} }
} else { } else {
r += s; nread += s;
} }
} while (r < 4); } while (nread < 4);
size = sftp_get_u32(buffer); size = sftp_get_u32(buffer);
if (size == 0 || size > SFTP_PACKET_SIZE_MAX) { if (size == 0 || size > SFTP_PACKET_SIZE_MAX) {
@@ -366,44 +368,44 @@ sftp_packet sftp_packet_read(sftp_session sftp)
} }
do { do {
r = ssh_channel_read(sftp->channel, buffer, 1, 0); nread = ssh_channel_read(sftp->channel, buffer, 1, 0);
if (r < 0) { if (nread < 0) {
goto error; goto error;
} else if (s == 0) { } else if (nread == 0) {
is_eof = ssh_channel_is_eof(sftp->channel); is_eof = ssh_channel_is_eof(sftp->channel);
if (is_eof) { if (is_eof) {
goto error; goto error;
} }
} }
} while (r < 1); } while (nread < 1);
packet->type = buffer[0]; packet->type = buffer[0];
/* Remove the packet type size */ /* Remove the packet type size */
size -= sizeof(uint8_t); size -= sizeof(uint8_t);
r = ssh_buffer_allocate_size(packet->payload, size); nread = ssh_buffer_allocate_size(packet->payload, size);
if (r < 0) { if (nread < 0) {
ssh_set_error_oom(sftp->session); ssh_set_error_oom(sftp->session);
goto error; goto error;
} }
while (size > 0 && size < SFTP_PACKET_SIZE_MAX) { while (size > 0 && size < SFTP_PACKET_SIZE_MAX) {
r = ssh_channel_read(sftp->channel, nread = ssh_channel_read(sftp->channel,
buffer, buffer,
sizeof(buffer) > size ? size : sizeof(buffer), sizeof(buffer) > size ? size : sizeof(buffer),
0); 0);
if (r < 0) { if (nread < 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 */
goto error; goto error;
} }
if (r > 0) { if (nread > 0) {
rc = ssh_buffer_add_data(packet->payload, buffer, r); rc = ssh_buffer_add_data(packet->payload, buffer, nread);
if (rc != 0) { if (rc != 0) {
ssh_set_error_oom(sftp->session); ssh_set_error_oom(sftp->session);
goto error; goto error;
} }
} else { /* r == 0 */ } else { /* nread == 0 */
/* Retry the reading unless the remote was closed */ /* Retry the reading unless the remote was closed */
is_eof = ssh_channel_is_eof(sftp->channel); is_eof = ssh_channel_is_eof(sftp->channel);
if (is_eof) { if (is_eof) {
@@ -411,7 +413,7 @@ sftp_packet sftp_packet_read(sftp_session sftp)
} }
} }
size -= r; size -= nread;
} }
return packet; return packet;