gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit f5d47cf92d942cea5234759234d8a7b40d84494a
parent b3edc7b2ad04d09d84b06367b6c38c60ceebb33e
Author: Jacki <jacki@thejackimonster.de>
Date:   Tue,  8 Oct 2024 23:52:50 +0200

MESSENGER: prevent invalid member sessions

Signed-off-by: Jacki <jacki@thejackimonster.de>

Diffstat:
Msrc/service/messenger/gnunet-service-messenger_member_session.c | 21++++++++++++++++-----
Msrc/service/messenger/gnunet-service-messenger_message_send.c | 26+++++++++++++++++++-------
2 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/src/service/messenger/gnunet-service-messenger_member_session.c b/src/service/messenger/gnunet-service-messenger_member_session.c @@ -49,7 +49,7 @@ create_member_session (struct GNUNET_MESSENGER_Member *member, get_member_session_id (session), &(session->context) ); - + { struct GNUNET_MESSENGER_ContactStore *store; @@ -187,7 +187,7 @@ iterate_copy_history (void *cls, struct GNUNET_MESSENGER_MemberSession *next; GNUNET_assert ((cls) && (key)); - + next = cls; GNUNET_CONTAINER_multihashmap_put (next->history, key, (value? next : NULL), @@ -213,8 +213,19 @@ switch_member_session (struct GNUNET_MESSENGER_MemberSession *session, next = GNUNET_new (struct GNUNET_MESSENGER_MemberSession); if (GNUNET_MESSENGER_KIND_ID == message->header.kind) + { next->member = add_store_member (session->member->store, &(message->body.id.id)); + if (! next->member) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Failed to switch member session to ID: %s\n", + GNUNET_sh2s (&(message->body.id.id))); + + GNUNET_free (next); + return NULL; + } + } else next->member = session->member; @@ -286,7 +297,7 @@ destroy_member_session (struct GNUNET_MESSENGER_MemberSession *session) clear_list_messages (&(session->messages)); - contact = get_member_session_contact ( session); + contact = get_member_session_contact (session); if ((contact) && (GNUNET_YES == decrease_contact_rc (contact))) remove_store_contact ( @@ -757,7 +768,7 @@ load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session, { struct GNUNET_MESSENGER_Member *member; - + member = get_store_member (session->member->store, &next_id); session->next = get_cycle_safe_next_session ( @@ -786,7 +797,7 @@ iterate_save_member_session_history_hentries (void *cls, unsigned char ownership; GNUNET_assert ((cls) && (key)); - + handle = cls; ownership = value? GNUNET_YES : GNUNET_NO; diff --git a/src/service/messenger/gnunet-service-messenger_message_send.c b/src/service/messenger/gnunet-service-messenger_message_send.c @@ -49,6 +49,8 @@ notify_about_members (struct GNUNET_MESSENGER_MemberNotify *notify, struct GNUNET_MESSENGER_MessageStore *message_store; struct GNUNET_MESSENGER_ListMessage *element; + GNUNET_assert ((notify) && (session) && (map)); + if (session->prev) notify_about_members (notify, session->prev, map, GNUNET_YES); @@ -80,6 +82,7 @@ notify_about_members (struct GNUNET_MESSENGER_MemberNotify *notify, NULL, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Notification of session message could be duplicated!\n"); @@ -112,21 +115,22 @@ iterate_notify_about_members (void *cls, struct GNUNET_MESSENGER_MemberNotify *notify; GNUNET_assert ((cls) && (session)); - - notify = cls; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Notify about member session: %s\n", - GNUNET_sh2s (get_member_session_id (session))); + notify = cls; if ((notify->session == session) || (GNUNET_YES == is_member_session_completed (session))) return GNUNET_YES; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Notify about member session: %s\n", + GNUNET_sh2s (get_member_session_id (session))); + { struct GNUNET_CONTAINER_MultiHashMap *map; map = GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO); - notify_about_members (notify, session, map, GNUNET_NO); + if (map) + notify_about_members (notify, session, map, GNUNET_NO); GNUNET_CONTAINER_multihashmap_destroy (map); } @@ -151,6 +155,14 @@ send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, member = add_store_member (member_store, &(message->header.sender_id)); + if (! member) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "A member could not join with ID: %s\n", + GNUNET_sh2s (&(message->header.sender_id))); + goto skip_member_notification; + } + session = get_member_session_of (member, message, hash); if (! session) @@ -172,7 +184,7 @@ send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, GNUNET_sh2s (get_member_session_id (session))); iterate_store_members (get_srv_room_member_store (room), - iterate_notify_about_members, &notify); + iterate_notify_about_members, &notify); } skip_member_notification: @@ -223,7 +235,7 @@ send_message_request (struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *hash) { struct GNUNET_MESSENGER_OperationStore *operation_store; - + operation_store = get_srv_room_operation_store (room); use_store_operation (