diff options
author | TheJackiMonster <thejackimonster@gmail.com> | 2022-03-15 23:41:43 +0100 |
---|---|---|
committer | TheJackiMonster <thejackimonster@gmail.com> | 2022-03-15 23:41:43 +0100 |
commit | b89df2053b1b0f9e33d676606546ac091a142e04 (patch) | |
tree | 77bdfa18e1f9900219c65dcb157b34d59bc7ae90 /src/messenger | |
parent | cfd3db44a82330272752ab3da08f1823c9867652 (diff) | |
download | gnunet-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.c | 4 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_member_session.c | 8 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_room.c | 28 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_room.h | 15 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_service.c | 8 |
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) | |||
142 | completion: | 145 | completion: |
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 | |||
92 | handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room); | 92 | handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room); |
93 | 93 | ||
94 | void | 94 | void |
95 | destroy_room (struct GNUNET_MESSENGER_SrvRoom *room) | 95 | destroy_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 | ||
120 | skip_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 | ||
1228 | void | ||
1229 | remove_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 | |||
1224 | static void | 1242 | static void |
1225 | remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room, | 1243 | remove_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 | */ |
100 | void | 104 | void |
101 | destroy_room (struct GNUNET_MESSENGER_SrvRoom *room); | 105 | destroy_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); | |||
364 | void | 369 | void |
365 | save_room (struct GNUNET_MESSENGER_SrvRoom *room); | 370 | save_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 | */ | ||
377 | void | ||
378 | remove_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 |