mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-11 10:40:27 +09:00
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
This commit is contained in:
20
src/socket.c
20
src/socket.c
@@ -233,8 +233,8 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,
|
|||||||
void *v_s)
|
void *v_s)
|
||||||
{
|
{
|
||||||
ssh_socket s = (ssh_socket)v_s;
|
ssh_socket s = (ssh_socket)v_s;
|
||||||
char buffer[MAX_BUF_SIZE];
|
void *buffer = NULL;
|
||||||
ssize_t nread;
|
ssize_t nread = 0;
|
||||||
int rc;
|
int rc;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
socklen_t errlen = sizeof(err);
|
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) {
|
if ((revents & POLLIN) && s->state == SSH_SOCKET_CONNECTED) {
|
||||||
s->read_wontblock = 1;
|
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) {
|
if (nread < 0) {
|
||||||
|
ssh_buffer_pass_bytes_end(s->in_buffer, MAX_BUF_SIZE);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
ssh_poll_remove_events(p, POLLIN);
|
ssh_poll_remove_events(p, POLLIN);
|
||||||
}
|
}
|
||||||
@@ -288,6 +292,10 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,
|
|||||||
}
|
}
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Rollback the unused space */
|
||||||
|
ssh_buffer_pass_bytes_end(s->in_buffer, MAX_BUF_SIZE - nread);
|
||||||
|
|
||||||
if (nread == 0) {
|
if (nread == 0) {
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
ssh_poll_remove_events(p, POLLIN);
|
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;
|
s->session->socket_counter->in_bytes += nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bufferize the data and then call the callback */
|
/* Call the callback */
|
||||||
rc = ssh_buffer_add_data(s->in_buffer, buffer, nread);
|
|
||||||
if (rc < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (s->callbacks != NULL && s->callbacks->data != NULL) {
|
if (s->callbacks != NULL && s->callbacks->data != NULL) {
|
||||||
do {
|
do {
|
||||||
nread = s->callbacks->data(ssh_buffer_get(s->in_buffer),
|
nread = s->callbacks->data(ssh_buffer_get(s->in_buffer),
|
||||||
|
|||||||
Reference in New Issue
Block a user