From 3ab17e3fbdd801d73d853415c6825694acca2173 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Tue, 11 May 2021 14:59:39 +0800 Subject: [PATCH] channels: Read into buffer directly in channel_read_buffer to avoid allocate 8KB buffer from stack Signed-off-by: Xiang Xiao Reviewed-by: Jakub Jelen Change-Id: Ifc198705cb8ecec6f0a609f84965382dc151693b --- src/channels.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/channels.c b/src/channels.c index b3a0d494..112a38f9 100644 --- a/src/channels.c +++ b/src/channels.c @@ -2753,7 +2753,7 @@ error: int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count, int is_stderr) { ssh_session session; - char buffer_tmp[8192]; + char *buffer_tmp = NULL; int r; uint32_t total=0; @@ -2775,14 +2775,19 @@ int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count, return r; } if(r > 0){ + count = r; + buffer_tmp = ssh_buffer_allocate(buffer, count); + if (buffer_tmp == NULL) { + ssh_set_error_oom(session); + return SSH_ERROR; + } r=ssh_channel_read(channel, buffer_tmp, r, is_stderr); if(r < 0){ + ssh_buffer_pass_bytes_end(buffer, count); return r; } - if(ssh_buffer_add_data(buffer,buffer_tmp,r) < 0){ - ssh_set_error_oom(session); - r = SSH_ERROR; - } + /* Rollback the unused space */ + ssh_buffer_pass_bytes_end(buffer, count - r); return r; } @@ -2792,19 +2797,23 @@ int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count, ssh_handle_packets(channel->session, SSH_TIMEOUT_INFINITE); } while (r == 0); } + + buffer_tmp = ssh_buffer_allocate(buffer, count); + if (buffer_tmp == NULL) { + ssh_set_error_oom(session); + return SSH_ERROR; + } while(total < count){ - r=ssh_channel_read(channel, buffer_tmp, sizeof(buffer_tmp), is_stderr); + r=ssh_channel_read(channel, buffer_tmp, count - total, is_stderr); if(r<0){ + ssh_buffer_pass_bytes_end(buffer, count); return r; } if(r==0){ + /* Rollback the unused space */ + ssh_buffer_pass_bytes_end(buffer, count - total); return total; } - if (ssh_buffer_add_data(buffer,buffer_tmp,r) < 0) { - ssh_set_error_oom(session); - - return SSH_ERROR; - } total += r; }