diff options
author | Xiang Xiao <xiaoxiang@xiaomi.com> | 2021-05-11 14:59:39 +0800 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2021-05-27 13:45:47 +0200 |
commit | 3ab17e3fbdd801d73d853415c6825694acca2173 (patch) | |
tree | e3071efd86fc1a407e2708f49c23ebcfad1f5cfc | |
parent | c027585a501a4597fe12b41e96c9de9d3d29b23b (diff) | |
download | libssh-3ab17e3fbdd801d73d853415c6825694acca2173.tar.gz libssh-3ab17e3fbdd801d73d853415c6825694acca2173.tar.xz libssh-3ab17e3fbdd801d73d853415c6825694acca2173.zip |
channels: Read into buffer directly in channel_read_buffer
to avoid allocate 8KB buffer from stack
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
Reviewed-by: Jakub Jelen <jjelen@redhat.com>
Change-Id: Ifc198705cb8ecec6f0a609f84965382dc151693b
-rw-r--r-- | src/channels.c | 31 |
1 files 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; } |