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:
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, ¬ify);
+ iterate_notify_about_members, ¬ify);
}
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 (