diff options
-rwxr-xr-x[-rw-r--r--] | src/messenger/gnunet-messenger.c | 14 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/gnunet-service-messenger.c | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/gnunet-service-messenger_member.c | 10 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/gnunet-service-messenger_message_store.c | 10 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/gnunet-service-messenger_operation_store.c | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/messenger_api_contact_store.c | 9 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/messenger_api_message.c | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/messenger_api_room.c | 16 | ||||
-rwxr-xr-x[-rw-r--r--] | src/messenger/messenger_api_room.h | 6 |
9 files changed, 47 insertions, 28 deletions
diff --git a/src/messenger/gnunet-messenger.c b/src/messenger/gnunet-messenger.c index 737bb83c8..094ae398d 100644..100755 --- a/src/messenger/gnunet-messenger.c +++ b/src/messenger/gnunet-messenger.c | |||
@@ -229,18 +229,12 @@ on_identity (void *cls, struct GNUNET_MESSENGER_Handle *handle) | |||
229 | if (room_key) | 229 | if (room_key) |
230 | GNUNET_CRYPTO_hash (room_key, strlen (room_key), &key); | 230 | GNUNET_CRYPTO_hash (room_key, strlen (room_key), &key); |
231 | 231 | ||
232 | struct GNUNET_PeerIdentity door_peer; | ||
232 | struct GNUNET_PeerIdentity *door = NULL; | 233 | struct GNUNET_PeerIdentity *door = NULL; |
233 | 234 | ||
234 | if (door_id) | 235 | if ((door_id) && |
235 | { | 236 | (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (door_id, strlen (door_id), &(door_peer.public_key)))) |
236 | door = GNUNET_new(struct GNUNET_PeerIdentity); | 237 | door = &door_peer; |
237 | |||
238 | if (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (door_id, strlen (door_id), &(door->public_key))) | ||
239 | { | ||
240 | GNUNET_free(door); | ||
241 | door = NULL; | ||
242 | } | ||
243 | } | ||
244 | 238 | ||
245 | const char *name = GNUNET_MESSENGER_get_name (handle); | 239 | const char *name = GNUNET_MESSENGER_get_name (handle); |
246 | 240 | ||
diff --git a/src/messenger/gnunet-service-messenger.c b/src/messenger/gnunet-service-messenger.c index 187b65ed5..76fb31d95 100644..100755 --- a/src/messenger/gnunet-service-messenger.c +++ b/src/messenger/gnunet-service-messenger.c | |||
@@ -191,7 +191,7 @@ check_send_message (void *cls, const struct GNUNET_MESSENGER_SendMessage *msg) | |||
191 | const uint16_t length = full_length - sizeof(*msg); | 191 | const uint16_t length = full_length - sizeof(*msg); |
192 | const char *buffer = ((const char*) msg) + sizeof(*msg); | 192 | const char *buffer = ((const char*) msg) + sizeof(*msg); |
193 | 193 | ||
194 | uint16_t key_length = 0; | 194 | ssize_t key_length = 0; |
195 | 195 | ||
196 | if (!(flags & GNUNET_MESSENGER_FLAG_PRIVATE)) | 196 | if (!(flags & GNUNET_MESSENGER_FLAG_PRIVATE)) |
197 | goto check_for_message; | 197 | goto check_for_message; |
@@ -231,7 +231,7 @@ handle_send_message (void *cls, const struct GNUNET_MESSENGER_SendMessage *msg) | |||
231 | const char *buffer = ((const char*) msg) + sizeof(*msg); | 231 | const char *buffer = ((const char*) msg) + sizeof(*msg); |
232 | 232 | ||
233 | const uint16_t length = ntohs (msg->header.size) - sizeof(*msg); | 233 | const uint16_t length = ntohs (msg->header.size) - sizeof(*msg); |
234 | uint16_t key_length = 0; | 234 | ssize_t key_length = 0; |
235 | 235 | ||
236 | struct GNUNET_IDENTITY_PublicKey public_key; | 236 | struct GNUNET_IDENTITY_PublicKey public_key; |
237 | 237 | ||
diff --git a/src/messenger/gnunet-service-messenger_member.c b/src/messenger/gnunet-service-messenger_member.c index 6e39cec13..7f00e8438 100644..100755 --- a/src/messenger/gnunet-service-messenger_member.c +++ b/src/messenger/gnunet-service-messenger_member.c | |||
@@ -335,7 +335,11 @@ add_member_session (struct GNUNET_MESSENGER_Member *member, struct GNUNET_MESSEN | |||
335 | struct GNUNET_HashCode hash; | 335 | struct GNUNET_HashCode hash; |
336 | GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash); | 336 | GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash); |
337 | 337 | ||
338 | GNUNET_CONTAINER_multihashmap_put(member->sessions, &hash, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); | 338 | if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put( |
339 | member->sessions, &hash, session, | ||
340 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) | ||
341 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Adding a member session failed: %s\n", | ||
342 | GNUNET_h2s(&hash)); | ||
339 | } | 343 | } |
340 | 344 | ||
341 | void | 345 | void |
@@ -348,7 +352,9 @@ remove_member_session (struct GNUNET_MESSENGER_Member *member, struct GNUNET_MES | |||
348 | struct GNUNET_HashCode hash; | 352 | struct GNUNET_HashCode hash; |
349 | GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash); | 353 | GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash); |
350 | 354 | ||
351 | GNUNET_CONTAINER_multihashmap_remove(member->sessions, &hash, session); | 355 | if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(member->sessions, &hash, session)) |
356 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a member session failed: %s\n", | ||
357 | GNUNET_h2s(&hash)); | ||
352 | } | 358 | } |
353 | 359 | ||
354 | struct GNUNET_MESSENGER_ClosureIterateSessions { | 360 | struct GNUNET_MESSENGER_ClosureIterateSessions { |
diff --git a/src/messenger/gnunet-service-messenger_message_store.c b/src/messenger/gnunet-service-messenger_message_store.c index 1f3d262ac..b143c6c98 100644..100755 --- a/src/messenger/gnunet-service-messenger_message_store.c +++ b/src/messenger/gnunet-service-messenger_message_store.c | |||
@@ -158,6 +158,8 @@ load_message_store_links (struct GNUNET_MESSENGER_MessageStore *store, const cha | |||
158 | struct GNUNET_MESSENGER_MessageLinkStorage storage; | 158 | struct GNUNET_MESSENGER_MessageLinkStorage storage; |
159 | struct GNUNET_MESSENGER_MessageLink *link = NULL; | 159 | struct GNUNET_MESSENGER_MessageLink *link = NULL; |
160 | 160 | ||
161 | memset(&storage, 0, sizeof(storage)); | ||
162 | |||
161 | do | 163 | do |
162 | { | 164 | { |
163 | if ((sizeof(storage.hash) != GNUNET_DISK_file_read (entries, &(storage.hash), sizeof(storage.hash))) || | 165 | if ((sizeof(storage.hash) != GNUNET_DISK_file_read (entries, &(storage.hash), sizeof(storage.hash))) || |
@@ -311,6 +313,8 @@ save_message_store (struct GNUNET_MESSENGER_MessageStore *store, const char *dir | |||
311 | save.store = store; | 313 | save.store = store; |
312 | save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE, permission); | 314 | save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE, permission); |
313 | 315 | ||
316 | GNUNET_free(filename); | ||
317 | |||
314 | if (!save.storage) | 318 | if (!save.storage) |
315 | goto save_entries; | 319 | goto save_entries; |
316 | 320 | ||
@@ -324,7 +328,6 @@ close_links: | |||
324 | GNUNET_DISK_file_close (save.storage); | 328 | GNUNET_DISK_file_close (save.storage); |
325 | 329 | ||
326 | save_entries: | 330 | save_entries: |
327 | GNUNET_free(filename); | ||
328 | GNUNET_asprintf (&filename, "%s%s", directory, "entries.store"); | 331 | GNUNET_asprintf (&filename, "%s%s", directory, "entries.store"); |
329 | 332 | ||
330 | save.store = store; | 333 | save.store = store; |
@@ -417,7 +420,10 @@ get_store_message (struct GNUNET_MESSENGER_MessageStore *store, const struct GNU | |||
417 | 420 | ||
418 | if ((GNUNET_YES != decoding) || (GNUNET_CRYPTO_hash_cmp (hash, &check) != 0)) | 421 | if ((GNUNET_YES != decoding) || (GNUNET_CRYPTO_hash_cmp (hash, &check) != 0)) |
419 | { | 422 | { |
420 | GNUNET_CONTAINER_multihashmap_remove (store->entries, hash, entry); | 423 | if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->entries, hash, entry)) |
424 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Corrupted entry could not be removed from store: %s\n", | ||
425 | GNUNET_h2s(hash)); | ||
426 | |||
421 | store->rewrite_entries = GNUNET_YES; | 427 | store->rewrite_entries = GNUNET_YES; |
422 | 428 | ||
423 | goto free_message; | 429 | goto free_message; |
diff --git a/src/messenger/gnunet-service-messenger_operation_store.c b/src/messenger/gnunet-service-messenger_operation_store.c index 05985ef84..a32fbad2c 100644..100755 --- a/src/messenger/gnunet-service-messenger_operation_store.c +++ b/src/messenger/gnunet-service-messenger_operation_store.c | |||
@@ -184,7 +184,9 @@ cancel_store_operation (struct GNUNET_MESSENGER_OperationStore *store, | |||
184 | 184 | ||
185 | stop_operation(op); | 185 | stop_operation(op); |
186 | 186 | ||
187 | GNUNET_CONTAINER_multihashmap_remove(store->operations, hash, op); | 187 | if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(store->operations, hash, op)) |
188 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Canceled operation could not be removed: %s\n", | ||
189 | GNUNET_h2s(hash)); | ||
188 | 190 | ||
189 | destroy_operation(op); | 191 | destroy_operation(op); |
190 | } | 192 | } |
diff --git a/src/messenger/messenger_api_contact_store.c b/src/messenger/messenger_api_contact_store.c index 5238b2c58..6a517c2e0 100644..100755 --- a/src/messenger/messenger_api_contact_store.c +++ b/src/messenger/messenger_api_contact_store.c | |||
@@ -155,8 +155,10 @@ update_store_contact (struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET | |||
155 | store, next_context, &hash | 155 | store, next_context, &hash |
156 | ); | 156 | ); |
157 | 157 | ||
158 | GNUNET_CONTAINER_multihashmap_put (map, &hash, contact, | 158 | if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &hash, contact, |
159 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); | 159 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) |
160 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating a contact failed: %s\n", | ||
161 | GNUNET_h2s(&hash)); | ||
160 | } | 162 | } |
161 | } | 163 | } |
162 | 164 | ||
@@ -176,7 +178,8 @@ remove_store_contact (struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET | |||
176 | ); | 178 | ); |
177 | 179 | ||
178 | if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact)) | 180 | if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact)) |
179 | return; | 181 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a contact failed: %s\n", |
182 | GNUNET_h2s(&hash)); | ||
180 | 183 | ||
181 | destroy_contact (contact); | 184 | destroy_contact (contact); |
182 | } | 185 | } |
diff --git a/src/messenger/messenger_api_message.c b/src/messenger/messenger_api_message.c index d88859186..0d885f9ee 100644..100755 --- a/src/messenger/messenger_api_message.c +++ b/src/messenger/messenger_api_message.c | |||
@@ -590,7 +590,7 @@ int | |||
590 | decode_message (struct GNUNET_MESSENGER_Message *message, uint16_t length, const char *buffer, | 590 | decode_message (struct GNUNET_MESSENGER_Message *message, uint16_t length, const char *buffer, |
591 | int include_signature, uint16_t *padding) | 591 | int include_signature, uint16_t *padding) |
592 | { | 592 | { |
593 | GNUNET_assert((message) && (buffer)); | 593 | GNUNET_assert((message) && (buffer) && (length >= sizeof(message->header))); |
594 | 594 | ||
595 | uint16_t offset = 0; | 595 | uint16_t offset = 0; |
596 | 596 | ||
diff --git a/src/messenger/messenger_api_room.c b/src/messenger/messenger_api_room.c index df141ca12..5b7edee60 100644..100755 --- a/src/messenger/messenger_api_room.c +++ b/src/messenger/messenger_api_room.c | |||
@@ -106,7 +106,7 @@ get_room_sender (const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_H | |||
106 | return (entry? entry->sender : NULL); | 106 | return (entry? entry->sender : NULL); |
107 | } | 107 | } |
108 | 108 | ||
109 | static void | 109 | static struct GNUNET_MESSENGER_Contact* |
110 | handle_join_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, | 110 | handle_join_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, |
111 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) | 111 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) |
112 | { | 112 | { |
@@ -124,6 +124,8 @@ handle_join_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER | |||
124 | (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put(room->members, &(message->header.sender_id), sender, | 124 | (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put(room->members, &(message->header.sender_id), sender, |
125 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE))) | 125 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE))) |
126 | increase_contact_rc(sender); | 126 | increase_contact_rc(sender); |
127 | |||
128 | return sender; | ||
127 | } | 129 | } |
128 | 130 | ||
129 | static void | 131 | static void |
@@ -140,7 +142,7 @@ handle_leave_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGE | |||
140 | struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store(room->handle); | 142 | struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store(room->handle); |
141 | 143 | ||
142 | if (GNUNET_YES == decrease_contact_rc(sender)) | 144 | if (GNUNET_YES == decrease_contact_rc(sender)) |
143 | remove_store_contact(store, sender, &context); | 145 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "A contact does not share any room with you anymore!\n"); |
144 | } | 146 | } |
145 | 147 | ||
146 | static void | 148 | static void |
@@ -216,17 +218,17 @@ handle_delete_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENG | |||
216 | } | 218 | } |
217 | } | 219 | } |
218 | 220 | ||
219 | void | 221 | struct GNUNET_MESSENGER_Contact* |
220 | handle_room_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, | 222 | handle_room_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, |
221 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) | 223 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) |
222 | { | 224 | { |
223 | if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains (room->messages, hash)) | 225 | if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains (room->messages, hash)) |
224 | return; | 226 | return sender; |
225 | 227 | ||
226 | switch (message->header.kind) | 228 | switch (message->header.kind) |
227 | { | 229 | { |
228 | case GNUNET_MESSENGER_KIND_JOIN: | 230 | case GNUNET_MESSENGER_KIND_JOIN: |
229 | handle_join_message (room, sender, message, hash); | 231 | sender = handle_join_message (room, sender, message, hash); |
230 | break; | 232 | break; |
231 | case GNUNET_MESSENGER_KIND_LEAVE: | 233 | case GNUNET_MESSENGER_KIND_LEAVE: |
232 | handle_leave_message (room, sender, message, hash); | 234 | handle_leave_message (room, sender, message, hash); |
@@ -253,7 +255,7 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER | |||
253 | struct GNUNET_MESSENGER_RoomMessageEntry *entry = GNUNET_new(struct GNUNET_MESSENGER_RoomMessageEntry); | 255 | struct GNUNET_MESSENGER_RoomMessageEntry *entry = GNUNET_new(struct GNUNET_MESSENGER_RoomMessageEntry); |
254 | 256 | ||
255 | if (!entry) | 257 | if (!entry) |
256 | return; | 258 | return sender; |
257 | 259 | ||
258 | entry->sender = sender; | 260 | entry->sender = sender; |
259 | entry->message = copy_message (message); | 261 | entry->message = copy_message (message); |
@@ -264,6 +266,8 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER | |||
264 | destroy_message (entry->message); | 266 | destroy_message (entry->message); |
265 | GNUNET_free(entry); | 267 | GNUNET_free(entry); |
266 | } | 268 | } |
269 | |||
270 | return sender; | ||
267 | } | 271 | } |
268 | 272 | ||
269 | struct GNUNET_MESSENGER_MemberCall | 273 | struct GNUNET_MESSENGER_MemberCall |
diff --git a/src/messenger/messenger_api_room.h b/src/messenger/messenger_api_room.h index 9455fd43b..eb41cf740 100644..100755 --- a/src/messenger/messenger_api_room.h +++ b/src/messenger/messenger_api_room.h | |||
@@ -100,12 +100,16 @@ get_room_sender (const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_H | |||
100 | * Handles a <i>message</i> with a given <i>hash</i> in a <i>room</i> for the client API to update | 100 | * Handles a <i>message</i> with a given <i>hash</i> in a <i>room</i> for the client API to update |
101 | * members and its information. The function also stores the message in map locally for access afterwards. | 101 | * members and its information. The function also stores the message in map locally for access afterwards. |
102 | * | 102 | * |
103 | * The contact of the message's sender could be updated or even created. It may not be freed or destroyed though! | ||
104 | * (The contact may still be in use for old messages...) | ||
105 | * | ||
103 | * @param[in/out] room Room | 106 | * @param[in/out] room Room |
104 | * @param[in/out] sender Contact of sender | 107 | * @param[in/out] sender Contact of sender |
105 | * @param[in] message Message | 108 | * @param[in] message Message |
106 | * @param[in] hash Hash of message | 109 | * @param[in] hash Hash of message |
110 | * @return Contact of sender | ||
107 | */ | 111 | */ |
108 | void | 112 | struct GNUNET_MESSENGER_Contact* |
109 | handle_room_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, | 113 | handle_room_message (struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, |
110 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash); | 114 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash); |
111 | 115 | ||