aboutsummaryrefslogtreecommitdiff
path: root/src/messenger
diff options
context:
space:
mode:
authorTheJackiMonster <thejackimonster@gmail.com>2022-03-15 23:41:43 +0100
committerTheJackiMonster <thejackimonster@gmail.com>2022-03-15 23:41:43 +0100
commitb89df2053b1b0f9e33d676606546ac091a142e04 (patch)
tree77bdfa18e1f9900219c65dcb157b34d59bc7ae90 /src/messenger
parentcfd3db44a82330272752ab3da08f1823c9867652 (diff)
downloadgnunet-b89df2053b1b0f9e33d676606546ac091a142e04.tar.gz
gnunet-b89df2053b1b0f9e33d676606546ac091a142e04.zip
-fix crash when member left messenger room
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
Diffstat (limited to 'src/messenger')
-rw-r--r--src/messenger/gnunet-service-messenger.c4
-rw-r--r--src/messenger/gnunet-service-messenger_member_session.c8
-rw-r--r--src/messenger/gnunet-service-messenger_room.c28
-rw-r--r--src/messenger/gnunet-service-messenger_room.h15
-rw-r--r--src/messenger/gnunet-service-messenger_service.c8
5 files changed, 49 insertions, 14 deletions
diff --git a/src/messenger/gnunet-service-messenger.c b/src/messenger/gnunet-service-messenger.c
index 546f4c0d2..31bffec18 100644
--- a/src/messenger/gnunet-service-messenger.c
+++ b/src/messenger/gnunet-service-messenger.c
@@ -170,9 +170,7 @@ handle_room_close (void *cls,
170 170
171 if (GNUNET_YES == close_handle_room (msg_client->handle, &(msg->key))) 171 if (GNUNET_YES == close_handle_room (msg_client->handle, &(msg->key)))
172 { 172 {
173 const struct GNUNET_ShortHashCode *member_id = get_handle_member_id (msg_client->handle, &(msg->key)); 173 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Closing room succeeded: %s\n", GNUNET_h2s (&(msg->key)));
174
175 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Closing room with member id: %s\n", GNUNET_sh2s (member_id));
176 174
177 struct GNUNET_MESSENGER_RoomMessage *response; 175 struct GNUNET_MESSENGER_RoomMessage *response;
178 struct GNUNET_MQ_Envelope *env; 176 struct GNUNET_MQ_Envelope *env;
diff --git a/src/messenger/gnunet-service-messenger_member_session.c b/src/messenger/gnunet-service-messenger_member_session.c
index 846dbbe2b..6bd1d24b8 100644
--- a/src/messenger/gnunet-service-messenger_member_session.c
+++ b/src/messenger/gnunet-service-messenger_member_session.c
@@ -84,6 +84,9 @@ check_member_session_completion (struct GNUNET_MESSENGER_MemberSession *session)
84{ 84{
85 GNUNET_assert (session); 85 GNUNET_assert (session);
86 86
87 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Check session history (%s) for completion.\n",
88 GNUNET_sh2s(get_member_session_id(session)));
89
87 if (!session->messages.tail) 90 if (!session->messages.tail)
88 { 91 {
89 session->completed = GNUNET_YES; 92 session->completed = GNUNET_YES;
@@ -142,7 +145,10 @@ check_member_session_completion (struct GNUNET_MESSENGER_MemberSession *session)
142completion: 145completion:
143 if (GNUNET_YES == is_member_session_completed(session)) 146 if (GNUNET_YES == is_member_session_completed(session))
144 { 147 {
145 GNUNET_CONTAINER_multihashmap_destroy (session->history); 148 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n",
149 GNUNET_sh2s(get_member_session_id(session)));
150
151 GNUNET_CONTAINER_multihashmap_clear (session->history);
146 152
147 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store(session->member->store); 153 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store(session->member->store);
148 154
diff --git a/src/messenger/gnunet-service-messenger_room.c b/src/messenger/gnunet-service-messenger_room.c
index 7f2fd0ca6..7a20d2191 100644
--- a/src/messenger/gnunet-service-messenger_room.c
+++ b/src/messenger/gnunet-service-messenger_room.c
@@ -92,14 +92,14 @@ static void
92handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room); 92handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room);
93 93
94void 94void
95destroy_room (struct GNUNET_MESSENGER_SrvRoom *room) 95destroy_room (struct GNUNET_MESSENGER_SrvRoom *room,
96 int deletion)
96{ 97{
97 GNUNET_assert(room); 98 GNUNET_assert(room);
98 99
99 if (room->idle) 100 if (room->idle)
100 { 101 {
101 GNUNET_SCHEDULER_cancel (room->idle); 102 GNUNET_SCHEDULER_cancel (room->idle);
102
103 room->idle = NULL; 103 room->idle = NULL;
104 } 104 }
105 105
@@ -107,18 +107,22 @@ destroy_room (struct GNUNET_MESSENGER_SrvRoom *room)
107 GNUNET_CADET_close_port (room->port); 107 GNUNET_CADET_close_port (room->port);
108 108
109 GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, iterate_destroy_tunnels, NULL); 109 GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, iterate_destroy_tunnels, NULL);
110
111 handle_room_messages (room); 110 handle_room_messages (room);
112 111
113 if (room->service->dir) 112 if (!(room->service->dir))
113 goto skip_saving;
114
115 if (GNUNET_YES == deletion)
116 remove_room (room);
117 else
114 save_room (room); 118 save_room (room);
115 119
120skip_saving:
116 clear_member_store (get_room_member_store(room)); 121 clear_member_store (get_room_member_store(room));
117 clear_message_store (get_room_message_store(room)); 122 clear_message_store (get_room_message_store(room));
118 clear_operation_store(get_room_operation_store(room)); 123 clear_operation_store(get_room_operation_store(room));
119 124
120 GNUNET_CONTAINER_multipeermap_destroy (room->tunnels); 125 GNUNET_CONTAINER_multipeermap_destroy (room->tunnels);
121
122 clear_list_tunnels (&(room->basement)); 126 clear_list_tunnels (&(room->basement));
123 clear_message_state(&(room->state)); 127 clear_message_state(&(room->state));
124 128
@@ -1221,6 +1225,20 @@ save_room (struct GNUNET_MESSENGER_SrvRoom *room)
1221 GNUNET_free(room_dir); 1225 GNUNET_free(room_dir);
1222} 1226}
1223 1227
1228void
1229remove_room (struct GNUNET_MESSENGER_SrvRoom *room)
1230{
1231 GNUNET_assert(room);
1232
1233 char *room_dir;
1234 get_room_data_subdir (room, &room_dir);
1235
1236 if (GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_YES))
1237 GNUNET_DISK_directory_remove(room_dir);
1238
1239 GNUNET_free(room_dir);
1240}
1241
1224static void 1242static void
1225remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room, 1243remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room,
1226 struct GNUNET_MESSENGER_MemberSession *session) 1244 struct GNUNET_MESSENGER_MemberSession *session)
diff --git a/src/messenger/gnunet-service-messenger_room.h b/src/messenger/gnunet-service-messenger_room.h
index 4b3811104..58edc4121 100644
--- a/src/messenger/gnunet-service-messenger_room.h
+++ b/src/messenger/gnunet-service-messenger_room.h
@@ -95,10 +95,15 @@ create_room (struct GNUNET_MESSENGER_SrvHandle *handle,
95/** 95/**
96 * Destroys a room and frees its memory fully. 96 * Destroys a room and frees its memory fully.
97 * 97 *
98 * The <i>deletion</i> flag should only be set to #GNUNET_YES if the
99 * room gets dropped by the service, otherwise #GNUNET_NO.
100 *
98 * @param[in/out] room Room 101 * @param[in/out] room Room
102 * @param[in] deletion Flag to indicate context of destruction
99 */ 103 */
100void 104void
101destroy_room (struct GNUNET_MESSENGER_SrvRoom *room); 105destroy_room (struct GNUNET_MESSENGER_SrvRoom *room,
106 int deletion);
102 107
103/** 108/**
104 * Returns the used member store of a given <i>room</i>. 109 * Returns the used member store of a given <i>room</i>.
@@ -364,4 +369,12 @@ load_room (struct GNUNET_MESSENGER_SrvRoom *room);
364void 369void
365save_room (struct GNUNET_MESSENGER_SrvRoom *room); 370save_room (struct GNUNET_MESSENGER_SrvRoom *room);
366 371
372/**
373 * Removes the configuration for a given <i>room</i> of a service.
374 *
375 * @param[in] room Room
376 */
377void
378remove_room (struct GNUNET_MESSENGER_SrvRoom *room);
379
367#endif //GNUNET_SERVICE_MESSENGER_ROOM_H 380#endif //GNUNET_SERVICE_MESSENGER_ROOM_H
diff --git a/src/messenger/gnunet-service-messenger_service.c b/src/messenger/gnunet-service-messenger_service.c
index b53b72af8..83d7632d8 100644
--- a/src/messenger/gnunet-service-messenger_service.c
+++ b/src/messenger/gnunet-service-messenger_service.c
@@ -94,7 +94,7 @@ iterate_destroy_rooms (void *cls,
94 void *value) 94 void *value)
95{ 95{
96 struct GNUNET_MESSENGER_SrvRoom *room = value; 96 struct GNUNET_MESSENGER_SrvRoom *room = value;
97 destroy_room (room); 97 destroy_room (room, GNUNET_NO);
98 return GNUNET_YES; 98 return GNUNET_YES;
99} 99}
100 100
@@ -220,7 +220,7 @@ open_service_room (struct GNUNET_MESSENGER_Service *service,
220 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))) 220 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
221 return GNUNET_YES; 221 return GNUNET_YES;
222 222
223 destroy_room (room); 223 destroy_room (room, GNUNET_YES);
224 return GNUNET_NO; 224 return GNUNET_NO;
225} 225}
226 226
@@ -253,7 +253,7 @@ entry_service_room (struct GNUNET_MESSENGER_Service *service,
253 } 253 }
254 else 254 else
255 { 255 {
256 destroy_room (room); 256 destroy_room (room, GNUNET_YES);
257 return GNUNET_NO; 257 return GNUNET_NO;
258 } 258 }
259 259
@@ -287,7 +287,7 @@ close_service_room (struct GNUNET_MESSENGER_Service *service,
287 { 287 {
288 if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (service->rooms, key, room)) 288 if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (service->rooms, key, room))
289 { 289 {
290 destroy_room (room); 290 destroy_room (room, GNUNET_YES);
291 return GNUNET_YES; 291 return GNUNET_YES;
292 } 292 }
293 else 293 else