gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] branch master updated: -fixed multiple leaks in messenger


From: gnunet
Subject: [gnunet] branch master updated: -fixed multiple leaks in messenger
Date: Mon, 29 Mar 2021 23:54:40 +0200

This is an automated email from the git hooks/post-receive script.

thejackimonster pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new d8b32bc60 -fixed multiple leaks in messenger
d8b32bc60 is described below

commit d8b32bc60d26a8a30b71530af0bd3e9e037e073b
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Mon Mar 29 23:52:28 2021 +0200

    -fixed multiple leaks in messenger
    
    Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 src/messenger/gnunet-messenger.c                         | 14 ++++----------
 src/messenger/gnunet-service-messenger.c                 |  4 ++--
 src/messenger/gnunet-service-messenger_member.c          | 10 ++++++++--
 src/messenger/gnunet-service-messenger_message_store.c   | 10 ++++++++--
 src/messenger/gnunet-service-messenger_operation_store.c |  4 +++-
 src/messenger/messenger_api_contact_store.c              |  9 ++++++---
 src/messenger/messenger_api_message.c                    |  2 +-
 src/messenger/messenger_api_room.c                       | 16 ++++++++++------
 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
old mode 100644
new mode 100755
index 737bb83c8..094ae398d
--- 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)
   if (room_key)
     GNUNET_CRYPTO_hash (room_key, strlen (room_key), &key);
 
+  struct GNUNET_PeerIdentity door_peer;
   struct GNUNET_PeerIdentity *door = NULL;
 
-  if (door_id)
-  {
-    door = GNUNET_new(struct GNUNET_PeerIdentity);
-
-    if (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (door_id, 
strlen (door_id), &(door->public_key)))
-    {
-      GNUNET_free(door);
-      door = NULL;
-    }
-  }
+  if ((door_id) &&
+      (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (door_id, 
strlen (door_id), &(door_peer.public_key))))
+    door = &door_peer;
 
   const char *name = GNUNET_MESSENGER_get_name (handle);
 
diff --git a/src/messenger/gnunet-service-messenger.c 
b/src/messenger/gnunet-service-messenger.c
old mode 100644
new mode 100755
index 187b65ed5..76fb31d95
--- 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)
   const uint16_t length = full_length - sizeof(*msg);
   const char *buffer = ((const char*) msg) + sizeof(*msg);
 
-  uint16_t key_length = 0;
+  ssize_t key_length = 0;
 
   if (!(flags & GNUNET_MESSENGER_FLAG_PRIVATE))
     goto check_for_message;
@@ -231,7 +231,7 @@ handle_send_message (void *cls, const struct 
GNUNET_MESSENGER_SendMessage *msg)
   const char *buffer = ((const char*) msg) + sizeof(*msg);
 
   const uint16_t length = ntohs (msg->header.size) - sizeof(*msg);
-  uint16_t key_length = 0;
+  ssize_t key_length = 0;
 
   struct GNUNET_IDENTITY_PublicKey public_key;
 
diff --git a/src/messenger/gnunet-service-messenger_member.c 
b/src/messenger/gnunet-service-messenger_member.c
old mode 100644
new mode 100755
index 6e39cec13..7f00e8438
--- 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
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash);
 
-  GNUNET_CONTAINER_multihashmap_put(member->sessions, &hash, session, 
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(
+      member->sessions, &hash, session,
+      GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Adding a member session failed: 
%s\n",
+               GNUNET_h2s(&hash));
 }
 
 void
@@ -348,7 +352,9 @@ remove_member_session (struct GNUNET_MESSENGER_Member 
*member, struct GNUNET_MES
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash);
 
-  GNUNET_CONTAINER_multihashmap_remove(member->sessions, &hash, session);
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(member->sessions, 
&hash, session))
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a member session failed: 
%s\n",
+               GNUNET_h2s(&hash));
 }
 
 struct GNUNET_MESSENGER_ClosureIterateSessions {
diff --git a/src/messenger/gnunet-service-messenger_message_store.c 
b/src/messenger/gnunet-service-messenger_message_store.c
old mode 100644
new mode 100755
index 1f3d262ac..b143c6c98
--- 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
   struct GNUNET_MESSENGER_MessageLinkStorage storage;
   struct GNUNET_MESSENGER_MessageLink *link = NULL;
 
+  memset(&storage, 0, sizeof(storage));
+
   do
   {
     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
   save.store = store;
   save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE | 
GNUNET_DISK_OPEN_CREATE, permission);
 
+  GNUNET_free(filename);
+
   if (!save.storage)
     goto save_entries;
 
@@ -324,7 +328,6 @@ close_links:
   GNUNET_DISK_file_close (save.storage);
 
 save_entries:
-  GNUNET_free(filename);
   GNUNET_asprintf (&filename, "%s%s", directory, "entries.store");
 
   save.store = store;
@@ -417,7 +420,10 @@ get_store_message (struct GNUNET_MESSENGER_MessageStore 
*store, const struct GNU
 
   if ((GNUNET_YES != decoding) || (GNUNET_CRYPTO_hash_cmp (hash, &check) != 0))
   {
-    GNUNET_CONTAINER_multihashmap_remove (store->entries, hash, entry);
+    if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->entries, 
hash, entry))
+      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Corrupted entry could not be 
removed from store: %s\n",
+                 GNUNET_h2s(hash));
+
     store->rewrite_entries = GNUNET_YES;
 
     goto free_message;
diff --git a/src/messenger/gnunet-service-messenger_operation_store.c 
b/src/messenger/gnunet-service-messenger_operation_store.c
old mode 100644
new mode 100755
index 05985ef84..a32fbad2c
--- 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,
 
   stop_operation(op);
 
-  GNUNET_CONTAINER_multihashmap_remove(store->operations, hash, op);
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(store->operations, 
hash, op))
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Canceled operation could not be 
removed: %s\n",
+               GNUNET_h2s(hash));
 
   destroy_operation(op);
 }
diff --git a/src/messenger/messenger_api_contact_store.c 
b/src/messenger/messenger_api_contact_store.c
old mode 100644
new mode 100755
index 5238b2c58..6a517c2e0
--- 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
         store, next_context, &hash
     );
 
-    GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
-                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
+                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating a contact failed: %s\n",
+                 GNUNET_h2s(&hash));
   }
 }
 
@@ -176,7 +178,8 @@ remove_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store, struct GNUNET
   );
 
   if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
-    return;
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a contact failed: %s\n",
+               GNUNET_h2s(&hash));
 
   destroy_contact (contact);
 }
diff --git a/src/messenger/messenger_api_message.c 
b/src/messenger/messenger_api_message.c
old mode 100644
new mode 100755
index d88859186..0d885f9ee
--- a/src/messenger/messenger_api_message.c
+++ b/src/messenger/messenger_api_message.c
@@ -590,7 +590,7 @@ int
 decode_message (struct GNUNET_MESSENGER_Message *message, uint16_t length, 
const char *buffer,
                 int include_signature, uint16_t *padding)
 {
-  GNUNET_assert((message) && (buffer));
+  GNUNET_assert((message) && (buffer) && (length >= sizeof(message->header)));
 
   uint16_t offset = 0;
 
diff --git a/src/messenger/messenger_api_room.c 
b/src/messenger/messenger_api_room.c
old mode 100644
new mode 100755
index df141ca12..5b7edee60
--- 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
   return (entry? entry->sender : NULL);
 }
 
-static void
+static struct GNUNET_MESSENGER_Contact*
 handle_join_message (struct GNUNET_MESSENGER_Room *room, struct 
GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message, const 
struct GNUNET_HashCode *hash)
 {
@@ -124,6 +124,8 @@ handle_join_message (struct GNUNET_MESSENGER_Room *room, 
struct GNUNET_MESSENGER
       (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put(room->members, 
&(message->header.sender_id), sender,
                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)))
     increase_contact_rc(sender);
+
+  return sender;
 }
 
 static void
@@ -140,7 +142,7 @@ handle_leave_message (struct GNUNET_MESSENGER_Room *room, 
struct GNUNET_MESSENGE
   struct GNUNET_MESSENGER_ContactStore *store = 
get_handle_contact_store(room->handle);
 
   if (GNUNET_YES == decrease_contact_rc(sender))
-    remove_store_contact(store, sender, &context);
+    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "A contact does not share any room 
with you anymore!\n");
 }
 
 static void
@@ -216,17 +218,17 @@ handle_delete_message (struct GNUNET_MESSENGER_Room 
*room, struct GNUNET_MESSENG
   }
 }
 
-void
+struct GNUNET_MESSENGER_Contact*
 handle_room_message (struct GNUNET_MESSENGER_Room *room, struct 
GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message, const 
struct GNUNET_HashCode *hash)
 {
   if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains (room->messages, 
hash))
-    return;
+    return sender;
 
   switch (message->header.kind)
   {
   case GNUNET_MESSENGER_KIND_JOIN:
-    handle_join_message (room, sender, message, hash);
+    sender = handle_join_message (room, sender, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_LEAVE:
     handle_leave_message (room, sender, message, hash);
@@ -253,7 +255,7 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room, 
struct GNUNET_MESSENGER
   struct GNUNET_MESSENGER_RoomMessageEntry *entry = GNUNET_new(struct 
GNUNET_MESSENGER_RoomMessageEntry);
 
   if (!entry)
-    return;
+    return sender;
 
   entry->sender = sender;
   entry->message = copy_message (message);
@@ -264,6 +266,8 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room, 
struct GNUNET_MESSENGER
     destroy_message (entry->message);
     GNUNET_free(entry);
   }
+
+  return sender;
 }
 
 struct GNUNET_MESSENGER_MemberCall
diff --git a/src/messenger/messenger_api_room.h 
b/src/messenger/messenger_api_room.h
old mode 100644
new mode 100755
index 9455fd43b..eb41cf740
--- 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
  * Handles a <i>message</i> with a given <i>hash</i> in a <i>room</i> for the 
client API to update
  * members and its information. The function also stores the message in map 
locally for access afterwards.
  *
+ * The contact of the message's sender could be updated or even created. It 
may not be freed or destroyed though!
+ * (The contact may still be in use for old messages...)
+ *
  * @param[in/out] room Room
  * @param[in/out] sender Contact of sender
  * @param[in] message Message
  * @param[in] hash Hash of message
+ * @return Contact of sender
  */
-void
+struct GNUNET_MESSENGER_Contact*
 handle_room_message (struct GNUNET_MESSENGER_Room *room, struct 
GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message, const 
struct GNUNET_HashCode *hash);
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]