aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXiang Xiao <xiaoxiang@xiaomi.com>2021-05-10 00:27:52 +0800
committerJakub Jelen <jjelen@redhat.com>2021-05-31 21:44:08 +0200
commitb6b5c59223cb75c7c3e815619610715e595370c8 (patch)
treee62dcd3aa13c1a03a448e0988fbafd801a7cbf4b /src
parentf7369423a48845a607a95ba19c0bf4c8943f111d (diff)
downloadlibssh-b6b5c59223cb75c7c3e815619610715e595370c8.tar.gz
libssh-b6b5c59223cb75c7c3e815619610715e595370c8.tar.xz
libssh-b6b5c59223cb75c7c3e815619610715e595370c8.zip
socket: Read the data directly into in_buffer
to avoid allocate 4KB buffer from stack Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com> Change-Id: Id144ff764ee1ae98f87aee36793a9f0e4fce21b7
Diffstat (limited to 'src')
-rw-r--r--src/socket.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/socket.c b/src/socket.c
index b3594311..bc18f382 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -233,8 +233,8 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,
void *v_s)
{
ssh_socket s = (ssh_socket)v_s;
- char buffer[MAX_BUF_SIZE];
- ssize_t nread;
+ void *buffer = NULL;
+ ssize_t nread = 0;
int rc;
int err = 0;
socklen_t errlen = sizeof(err);
@@ -275,8 +275,12 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,
}
if ((revents & POLLIN) && s->state == SSH_SOCKET_CONNECTED) {
s->read_wontblock = 1;
- nread = ssh_socket_unbuffered_read(s, buffer, sizeof(buffer));
+ buffer = ssh_buffer_allocate(s->in_buffer, MAX_BUF_SIZE);
+ if (buffer) {
+ nread = ssh_socket_unbuffered_read(s, buffer, MAX_BUF_SIZE);
+ }
if (nread < 0) {
+ ssh_buffer_pass_bytes_end(s->in_buffer, MAX_BUF_SIZE);
if (p != NULL) {
ssh_poll_remove_events(p, POLLIN);
}
@@ -288,6 +292,10 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,
}
return -2;
}
+
+ /* Rollback the unused space */
+ ssh_buffer_pass_bytes_end(s->in_buffer, MAX_BUF_SIZE - nread);
+
if (nread == 0) {
if (p != NULL) {
ssh_poll_remove_events(p, POLLIN);
@@ -304,11 +312,7 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,
s->session->socket_counter->in_bytes += nread;
}
- /* Bufferize the data and then call the callback */
- rc = ssh_buffer_add_data(s->in_buffer, buffer, nread);
- if (rc < 0) {
- return -1;
- }
+ /* Call the callback */
if (s->callbacks != NULL && s->callbacks->data != NULL) {
do {
nread = s->callbacks->data(ssh_buffer_get(s->in_buffer),