diff --git a/display/connection.c b/display/connection.c index 51507d1c..db745b4b 100644 --- a/display/connection.c +++ b/display/connection.c @@ -42,18 +42,21 @@ void connection_schedule_transmit(struct connection* connection, size_t available = connection->outgoing_size - connection->outgoing_used; if ( available < count ) { + // TODO: Overflow. size_t required_size = connection->outgoing_used + count; - unsigned char* new_outgoing = (unsigned char*) malloc(required_size); - size_t first_part_available = connection->outgoing_size - connection->outgoing_offset; - size_t first_part = connection->outgoing_used < first_part_available ? - connection->outgoing_used : - first_part_available; + // TODO: Check allocation. + unsigned char* new_outgoing = malloc(required_size); + size_t first_available = + connection->outgoing_size - connection->outgoing_offset; + size_t first = connection->outgoing_used < first_available ? + connection->outgoing_used : + first_available; if ( connection->outgoing ) { memcpy(new_outgoing, connection->outgoing + - connection->outgoing_offset, first_part); - size_t second_part = connection->outgoing_used - first_part; - memcpy(new_outgoing + first_part, connection->outgoing, second_part); + connection->outgoing_offset, first); + size_t second = connection->outgoing_used - first; + memcpy(new_outgoing + first, connection->outgoing, second); free(connection->outgoing); } connection->outgoing_offset = 0; @@ -61,12 +64,14 @@ void connection_schedule_transmit(struct connection* connection, connection->outgoing = new_outgoing; } - size_t used_offset = (connection->outgoing_offset + connection->outgoing_used) % connection->outgoing_size; - size_t first_part_available = connection->outgoing_size - used_offset; - size_t first_part = count < first_part_available ? count : first_part_available; - memcpy(connection->outgoing + used_offset, buffer, first_part); - size_t second_part = count - first_part; - memcpy(connection->outgoing, (const unsigned char*) buffer + first_part, second_part); + size_t used_offset = + (connection->outgoing_offset + connection->outgoing_used) % + connection->outgoing_size; + size_t first_available = connection->outgoing_size - used_offset; + size_t first = count < first_available ? count : first_available; + memcpy(connection->outgoing + used_offset, buffer, first); + size_t second = count - first; + memcpy(connection->outgoing, (const unsigned char*) buffer + first, second); connection->outgoing_used += count; } @@ -97,25 +102,28 @@ struct window* connection_find_window(struct connection* connection, } #define CONNECTION_MESSAGE_HANDLER_NO_AUX(message_name) \ -void connection_handler_##message_name(struct connection* connection, \ - struct display_##message_name* msg, \ - void* auxiliary __attribute__((unused)), \ - size_t auxiliary_size __attribute__((unused)), \ - const struct server* server __attribute__((unused))) +void connection_handler_##message_name( \ + struct connection* connection, \ + struct display_##message_name* msg, \ + void* auxiliary __attribute__((unused)), \ + size_t auxiliary_size __attribute__((unused)), \ + const struct server* server __attribute__((unused))) #define CONNECTION_MESSAGE_HANDLER(message_name) \ -void connection_handler_##message_name(struct connection* connection, \ - struct display_##message_name* msg, \ - unsigned char* auxiliary, \ - size_t auxiliary_size, \ - const struct server* server __attribute__((unused))) +void connection_handler_##message_name( \ + struct connection* connection, \ + struct display_##message_name* msg, \ + unsigned char* auxiliary, \ + size_t auxiliary_size, \ + const struct server* server __attribute__((unused))) #define CONNECTION_MESSAGE_HANDLER_SERVER(message_name) \ -void connection_handler_##message_name(struct connection* connection, \ - struct display_##message_name* msg, \ - unsigned char* auxiliary, \ - size_t auxiliary_size, \ - const struct server* server) +void connection_handler_##message_name( \ + struct connection* connection, \ + struct display_##message_name* msg, \ + unsigned char* auxiliary, \ + size_t auxiliary_size, \ + const struct server* server) CONNECTION_MESSAGE_HANDLER_NO_AUX(shutdown) { @@ -134,7 +142,8 @@ CONNECTION_MESSAGE_HANDLER_NO_AUX(shutdown) CONNECTION_MESSAGE_HANDLER_NO_AUX(create_window) { - struct window* window = connection_find_window_raw(connection, msg->window_id); + struct window* window = + connection_find_window_raw(connection, msg->window_id); if ( !window ) return; if ( window->created ) @@ -265,7 +274,8 @@ short connection_interested_poll_events(struct connection* connection) void connection_can_read(struct connection* connection, const struct server* server) { - while ( connection->packet_header_received < sizeof(connection->packet_header) ) + while ( connection->packet_header_received < + sizeof(connection->packet_header) ) { ssize_t amount = read(connection->fd, (unsigned char*) &connection->packet_header + @@ -275,12 +285,13 @@ void connection_can_read(struct connection* connection, if ( amount < 0 && (errno == EAGAIN || errno == EWOULDBLOCK) ) return; if ( amount < 0 || amount == 0 ) - return; // TODO: No longer signal interest in reading and disconnect. + return; // TODO: No longer signal interest in reading + disconnect. connection->packet_header_received += amount; } size_t packet_length = connection->packet_header.message_length; + // TODO: Check allocation and protect against too big buffers. if ( !connection->packet ) connection->packet = (unsigned char*) malloc(packet_length); @@ -292,7 +303,7 @@ void connection_can_read(struct connection* connection, if ( amount < 0 && (errno == EAGAIN || errno == EWOULDBLOCK) ) return; if ( amount < 0 || amount == 0 ) - return; // TODO: No longer signal interest in reading and disconnect. + return; // TODO: No longer signal interest in reading + disconnect. connection->packet_received += amount; } @@ -313,7 +324,7 @@ void connection_can_read(struct connection* connection, connection->packet = NULL; connection->packet_received = 0; - // TODO: Check if we can received another packet, but only if we haven't + // TODO: Check if we can receive another packet, but only if we haven't // done so much work that the display server is starved. } @@ -321,14 +332,18 @@ void connection_can_write(struct connection* connection) { while ( connection->outgoing_used ) { - size_t available = connection->outgoing_size - connection->outgoing_offset; - size_t count = connection->outgoing_used < available ? connection->outgoing_used : available; - ssize_t amount = write(connection->fd, connection->outgoing + connection->outgoing_offset, count); + size_t available = + connection->outgoing_size - connection->outgoing_offset; + size_t count = connection->outgoing_used < available ? + connection->outgoing_used : available; + unsigned char* buf = connection->outgoing + connection->outgoing_offset; + ssize_t amount = write(connection->fd, buf, count); if ( amount < 0 && (errno == EAGAIN || errno == EWOULDBLOCK) ) return; if ( amount < 0 || amount == 0 ) - return; // TODO: No longer signal interest in writing and disconnect. - connection->outgoing_offset = (connection->outgoing_offset + amount) % connection->outgoing_size; + return; // TODO: No longer signal interest in writing + disconnect. + connection->outgoing_offset = (connection->outgoing_offset + amount) % + connection->outgoing_size; connection->outgoing_used -= amount; } diff --git a/display/display.c b/display/display.c index a18312e8..20b27ddd 100644 --- a/display/display.c +++ b/display/display.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 2016, 2017, 2022 Jonas 'Sortie' Termansen. + * Copyright (c) 2014, 2015, 2016, 2017, 2022, 2023 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -52,7 +52,7 @@ int main(int argc, char* argv[]) const char* tty = NULL; int opt; - while ( (opt = getopt(argc, argv, "m:s:t")) != -1 ) + while ( (opt = getopt(argc, argv, "m:s:t:")) != -1 ) { switch ( opt ) { diff --git a/display/server.c b/display/server.c index 028f6eae..129bf25e 100644 --- a/display/server.c +++ b/display/server.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 2016 Jonas 'Sortie' Termansen. + * Copyright (c) 2014, 2015, 2016, 2023 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -43,7 +43,7 @@ static int open_local_server_socket(const char* path, int flags) { size_t path_length = strlen(path); size_t addr_size = offsetof(struct sockaddr_un, sun_path) + path_length + 1; - struct sockaddr_un* sockaddr = (struct sockaddr_un*) malloc(addr_size); + struct sockaddr_un* sockaddr = malloc(addr_size); if ( !sockaddr ) return -1; sockaddr->sun_family = AF_LOCAL; @@ -93,7 +93,7 @@ void server_initialize(struct server* server, struct display* display, err(1, "settermmode"); server->pfds_count = server_pfds_count(server); - server->pfds = (struct pollfd*) + server->pfds = reallocarray(NULL, sizeof(struct pollfd), server->pfds_count); if ( !server->pfds ) err(1, "malloc"); @@ -113,7 +113,7 @@ bool server_accept(struct server* server) size_t new_length = server->connections_length * 2; if ( !new_length ) new_length = 16; - struct connection** new_connections = (struct connection**) + struct connection** new_connections = reallocarray(server->connections, new_length, sizeof(struct connection*)); if ( !new_connections ) @@ -127,7 +127,7 @@ bool server_accept(struct server* server) } size_t new_pfds_count = server_pfds_count(server) + 1; - struct pollfd* new_pfds = (struct pollfd*) + struct pollfd* new_pfds = reallocarray(server->pfds, sizeof(struct pollfd), new_pfds_count); if ( !new_pfds ) { @@ -138,8 +138,7 @@ bool server_accept(struct server* server) server->pfds = new_pfds; server->pfds_count = new_pfds_count; - struct connection* connection = (struct connection*) - malloc(sizeof(struct connection)); + struct connection* connection = malloc(sizeof(struct connection)); if ( !connection ) { warn("dropped connection: %s: malloc", server->server_path); diff --git a/display/server.h b/display/server.h index a1973153..f50e7027 100644 --- a/display/server.h +++ b/display/server.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 2016 Jonas 'Sortie' Termansen. + * Copyright (c) 2014, 2015, 2016, 2023 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above diff --git a/libdisplay/libdisplay.c b/libdisplay/libdisplay.c index 076a684a..69c72065 100644 --- a/libdisplay/libdisplay.c +++ b/libdisplay/libdisplay.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 2016, 2017 Jonas 'Sortie' Termansen. + * Copyright (c) 2014, 2015, 2016, 2017, 2023 Jonas 'Sortie' Termansen. * Copyright (c) 2023 Juhani 'nortti' Krekelä. * * Permission to use, copy, modify, and distribute this software for any