From 84a1ac1baf0cdec49a2600f1872337612233ed01 Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Mon, 15 Nov 2021 11:18:39 +0100 Subject: -fixes memory leaks with message body decoding Signed-off-by: TheJackiMonster --- src/messenger/gnunet-service-messenger.c | 8 +++++--- src/messenger/gnunet-service-messenger_tunnel.c | 8 +++++--- src/messenger/messenger_api.c | 3 +++ src/messenger/messenger_api_message.c | 8 ++++++++ src/messenger/messenger_api_message.h | 8 ++++++++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/messenger/gnunet-service-messenger.c b/src/messenger/gnunet-service-messenger.c index 989157ceb..a994e16ee 100644 --- a/src/messenger/gnunet-service-messenger.c +++ b/src/messenger/gnunet-service-messenger.c @@ -227,10 +227,10 @@ check_for_message: if (GNUNET_YES != decode_message (&message, msg_length, msg_buffer, GNUNET_NO, NULL)) return GNUNET_NO; - if (GNUNET_YES != filter_message_sending(&message)) - return GNUNET_NO; + const int allowed = filter_message_sending(&message); - return GNUNET_OK; + cleanup_message(&message); + return GNUNET_YES == allowed? GNUNET_OK : GNUNET_NO; } static void @@ -278,6 +278,8 @@ handle_send_message (void *cls, GNUNET_MESSENGER_name_of_kind (message.header.kind), GNUNET_h2s (key)); end_handling: + cleanup_message(&message); + GNUNET_SERVICE_client_continue (msg_client->client); } diff --git a/src/messenger/gnunet-service-messenger_tunnel.c b/src/messenger/gnunet-service-messenger_tunnel.c index fdd6429e6..c21f298b3 100644 --- a/src/messenger/gnunet-service-messenger_tunnel.c +++ b/src/messenger/gnunet-service-messenger_tunnel.c @@ -176,6 +176,9 @@ handle_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header) { struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls; + if (!tunnel) + return; + const uint16_t length = ntohs (header->size) - sizeof(*header); const char *buffer = (const char*) &header[1]; @@ -190,9 +193,6 @@ handle_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header) GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Got message of kind: %s!\n", GNUNET_MESSENGER_name_of_kind(message.header.kind)); - if (!tunnel) - return; - const int new_message = update_room_message ( tunnel->room, copy_message (&message), &hash ); @@ -226,6 +226,8 @@ handle_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header) } receive_done: + cleanup_message(&message); + GNUNET_CADET_receive_done (tunnel->channel); } diff --git a/src/messenger/messenger_api.c b/src/messenger/messenger_api.c index ef6244e19..c9b143662 100644 --- a/src/messenger/messenger_api.c +++ b/src/messenger/messenger_api.c @@ -214,6 +214,7 @@ check_recv_message (void *cls, if (GNUNET_YES != decode_message (&message, length, buffer, GNUNET_YES, NULL)) return GNUNET_NO; + cleanup_message(&message); return GNUNET_OK; } @@ -259,6 +260,8 @@ handle_recv_message (void *cls, } else GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Room not found\n"); + + cleanup_message(&message); } static void diff --git a/src/messenger/messenger_api_message.c b/src/messenger/messenger_api_message.c index 05bf654fb..4e64cc22f 100644 --- a/src/messenger/messenger_api_message.c +++ b/src/messenger/messenger_api_message.c @@ -125,6 +125,14 @@ destroy_message_body (enum GNUNET_MESSENGER_MessageKind kind, } } +void +cleanup_message (struct GNUNET_MESSENGER_Message *message) +{ + GNUNET_assert(message); + + destroy_message_body (message->header.kind, &(message->body)); +} + void destroy_message (struct GNUNET_MESSENGER_Message *message) { diff --git a/src/messenger/messenger_api_message.h b/src/messenger/messenger_api_message.h index 6aebf4014..21161c134 100644 --- a/src/messenger/messenger_api_message.h +++ b/src/messenger/messenger_api_message.h @@ -61,6 +61,14 @@ create_message (enum GNUNET_MESSENGER_MessageKind kind); struct GNUNET_MESSENGER_Message* copy_message (const struct GNUNET_MESSENGER_Message *message); +/** + * Frees the messages body memory. + * + * @param[in/out] message Message + */ +void +cleanup_message (struct GNUNET_MESSENGER_Message *message); + /** * Destroys a message and frees its memory fully. * -- cgit v1.2.3