From 29011ac79232633c2b7ef7c95d4c0cf9b1eaf095 Mon Sep 17 00:00:00 2001 From: project-repo Date: Wed, 28 Dec 2022 11:08:23 +0100 Subject: [PATCH] Remove length restriction for ipc commands --- ipc_server.c | 34 +++++++++++++++++++--------------- ipc_server.h | 1 + parse.h | 2 -- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/ipc_server.c b/ipc_server.c index 0125e5e..7d455d9 100644 --- a/ipc_server.c +++ b/ipc_server.c @@ -8,6 +8,7 @@ */ #define _POSIX_C_SOURCE 200112L +#define _DEFAULT_SOURCE #include "ipc_server.h" #include "message.h" @@ -193,8 +194,8 @@ ipc_handle_connection(int fd, uint32_t mask, void *data) { close(client_fd); return 0; } - // +1 for \n and +1 for \0 - client->read_buffer = malloc(sizeof(char) * (MAX_LINE_SIZE + 2)); + client->read_buf_cap=64; + client->read_buffer = calloc(client->read_buf_cap,sizeof(char)); client->read_buf_len = 0; client->read_discard = 0; client->server = server; @@ -241,12 +242,18 @@ ipc_client_handle_readable(int client_fd, uint32_t mask, void *data) { return 0; } - int read_size = read_available < MAX_LINE_SIZE + 1 - client->read_buf_len - ? read_available - : MAX_LINE_SIZE + 1 - client->read_buf_len; + while(read_available+client->read_buf_len>(int32_t) client->read_buf_cap-1) { + client->read_buf_cap*=2; + client->read_buffer=reallocarray(client->read_buffer,client->read_buf_cap,sizeof(char)); + if(client->read_buffer == NULL) { + wlr_log(WLR_ERROR, "Unable to allocate buffer large enough to hold client read data"); + ipc_client_disconnect(client); + return 0; + } + } // Append to buffer ssize_t received = recv( - client_fd, client->read_buffer + client->read_buf_len, read_size, 0); + client_fd, client->read_buffer + client->read_buf_len, read_available, 0); if(received == -1) { wlr_log(WLR_ERROR, "Unable to receive data from IPC client"); ipc_client_disconnect(client); @@ -274,8 +281,12 @@ ipc_client_disconnect(struct cg_ipc_client *client) { wl_event_source_remove(client->writable_event_source); } wl_list_remove(&client->link); - free(client->write_buffer); - free(client->read_buffer); + if(client->write_buffer != NULL) { + free(client->write_buffer); + } + if(client->read_buffer != NULL) { + free(client->read_buffer); + } close(client->fd); free(client); } @@ -312,13 +323,6 @@ ipc_client_handle_command(struct cg_ipc_client *client) { } offset = (nl_pos - client->read_buffer) + 1; } - if(offset == 0) { - wlr_log(WLR_ERROR, "Line received was longer than %d, discarding it", - MAX_LINE_SIZE); - client->read_buf_len = 0; - client->read_discard = 1; - return; - } if(offset < client->read_buf_len) { memmove(client->read_buffer, client->read_buffer + offset, client->read_buf_len - offset); diff --git a/ipc_server.h b/ipc_server.h index 61ba631..7fc9d60 100644 --- a/ipc_server.h +++ b/ipc_server.h @@ -21,6 +21,7 @@ struct cg_ipc_client { char *write_buffer; // The following is for storing data between event_loop calls uint16_t read_buf_len; + size_t read_buf_cap; uint8_t read_discard; // 1 if the current line is to be discarded char *read_buffer; }; diff --git a/parse.h b/parse.h index cffb795..b1e6c59 100644 --- a/parse.h +++ b/parse.h @@ -2,8 +2,6 @@ #define PARSE_H -#define MAX_LINE_SIZE 512 - #include struct cg_server;