gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r36134 - gnunet/src/revocation


From: gnunet
Subject: [GNUnet-SVN] r36134 - gnunet/src/revocation
Date: Mon, 27 Jul 2015 23:27:00 +0200

Author: amatus
Date: 2015-07-27 23:27:00 +0200 (Mon, 27 Jul 2015)
New Revision: 36134

Modified:
   gnunet/src/revocation/gnunet-service-revocation.c
Log:
Fix segfault in handle_core_disconnect

The handle_revocation_union_request code for creating a PeerEntry
was not creating the MQ. Moved the duplicated code to it's own function
and also created one for delete.
Since the MQ was not created we get a segfault trying to destroy it
in handle_core_disconnect.


Modified: gnunet/src/revocation/gnunet-service-revocation.c
===================================================================
--- gnunet/src/revocation/gnunet-service-revocation.c   2015-07-27 20:44:56 UTC 
(rev 36133)
+++ gnunet/src/revocation/gnunet-service-revocation.c   2015-07-27 21:27:00 UTC 
(rev 36134)
@@ -146,8 +146,62 @@
 static struct GNUNET_HashCode revocation_set_union_app_id;
 
 
+/**
+ * Create a new PeerEntry and add it to the peers multipeermap.
+ *
+ * @param peer the peer identity
+ * @return a pointer to the new PeerEntry
+ */
+static struct PeerEntry *
+new_peer_entry(const struct GNUNET_PeerIdentity *peer)
+{
+  struct PeerEntry *peer_entry;
 
+  peer_entry = GNUNET_new (struct PeerEntry);
+  peer_entry->id = *peer;
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_CONTAINER_multipeermap_put (peers,
+                                                    &peer_entry->id,
+                                                    peer_entry,
+                                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+  peer_entry->mq = GNUNET_CORE_mq_create (core_api, peer);
+  return peer_entry;
+}
+
+
 /**
+ * Delete a PeerEntry for the given peer
+ *
+ * @param peer the identity of the peer to delete
+ */
+static void
+delete_peer_entry(const struct GNUNET_PeerIdentity *peer)
+{
+  struct PeerEntry *peer_entry;
+
+  peer_entry = GNUNET_CONTAINER_multipeermap_get (peers,
+                                                  peer);
+  GNUNET_assert (NULL != peer_entry);
+  GNUNET_assert (GNUNET_YES ==
+                 GNUNET_CONTAINER_multipeermap_remove (peers,
+                                                       peer,
+                                                       peer_entry));
+  GNUNET_MQ_destroy (peer_entry->mq);
+  if (NULL != peer_entry->transmit_task)
+  {
+    GNUNET_SCHEDULER_cancel (peer_entry->transmit_task);
+    peer_entry->transmit_task = NULL;
+  }
+  if (NULL != peer_entry->so)
+  {
+    GNUNET_SET_operation_cancel (peer_entry->so);
+    peer_entry->so = NULL;
+  }
+  GNUNET_free (peer_entry);
+}
+
+
+/**
  * An revoke message has been received, check that it is well-formed.
  *
  * @param rm the message to verify
@@ -536,14 +590,7 @@
        with.  This should be rare, but isn't impossible. */
     return;
   }
-  peer_entry = GNUNET_new (struct PeerEntry);
-  peer_entry->id = *peer;
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CONTAINER_multipeermap_put (peers,
-                                                    &peer_entry->id,
-                                                    peer_entry,
-                                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-  peer_entry->mq = GNUNET_CORE_mq_create (core_api, peer);
+  peer_entry = new_peer_entry(peer);
   GNUNET_CRYPTO_hash (&my_identity,
                       sizeof (my_identity),
                       &my_hash);
@@ -575,8 +622,6 @@
 handle_core_disconnect (void *cls,
                        const struct GNUNET_PeerIdentity *peer)
 {
-  struct PeerEntry *pos;
-
   if (0 == memcmp (peer,
                    &my_identity,
                    sizeof (my_identity)))
@@ -587,25 +632,7 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Peer `%s' disconnected from us\n",
               GNUNET_i2s (peer));
-  pos = GNUNET_CONTAINER_multipeermap_get (peers,
-                                           peer);
-  GNUNET_assert (NULL != pos);
-  GNUNET_assert (GNUNET_YES ==
-                 GNUNET_CONTAINER_multipeermap_remove (peers,
-                                                       peer,
-                                                       pos));
-  GNUNET_MQ_destroy (pos->mq);
-  if (NULL != pos->transmit_task)
-  {
-    GNUNET_SCHEDULER_cancel (pos->transmit_task);
-    pos->transmit_task = NULL;
-  }
-  if (NULL != pos->so)
-  {
-    GNUNET_SET_operation_cancel (pos->so);
-    pos->so = NULL;
-  }
-  GNUNET_free (pos);
+  delete_peer_entry(peer);
   GNUNET_STATISTICS_update (stats,
                             "# peers connected",
                             -1,
@@ -739,13 +766,7 @@
                                                   other_peer);
   if (NULL == peer_entry)
   {
-    peer_entry = GNUNET_new (struct PeerEntry);
-    peer_entry->id = *other_peer;
-    GNUNET_assert (GNUNET_OK ==
-                   GNUNET_CONTAINER_multipeermap_put (peers,
-                                                      other_peer,
-                                                      peer_entry,
-                                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+    peer_entry = new_peer_entry(other_peer);
   }
   peer_entry->so = GNUNET_SET_accept (request,
                                       GNUNET_SET_RESULT_ADDED,




reply via email to

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