- fix use of uninitialized memory
[oweals/gnunet.git] / src / consensus / consensus_api.c
index 5ebdf71e7320de214341e6f94b7020bfb82ba240..8906a232cae6c0cb0d3f66925b1b91f7962cd854 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2012 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2012 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -116,9 +116,10 @@ handle_new_element (void *cls,
       = (const struct GNUNET_CONSENSUS_ElementMessage *) mh;
   struct GNUNET_SET_Element element;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "received new element\n");
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "received new element\n");
 
-  element.type = msg->element_type;
+  element.element_type = msg->element_type;
   element.size = ntohs (msg->header.size) - sizeof (struct GNUNET_CONSENSUS_ElementMessage);
   element.data = &msg[1];
 
@@ -141,12 +142,35 @@ handle_conclude_done (void *cls,
 
   GNUNET_CONSENSUS_ConcludeCallback cc;
 
+  GNUNET_MQ_destroy (consensus->mq);
+  consensus->mq = NULL;
+
+  GNUNET_CLIENT_disconnect (consensus->client);
+  consensus->client = NULL;
+
+
   GNUNET_assert (NULL != (cc = consensus->conclude_cb));
   consensus->conclude_cb = NULL;
   cc (consensus->conclude_cls);
 }
 
 
+/**
+ * Generic error handler, called with the appropriate
+ * error code and the same closure specified at the creation of
+ * the message queue.
+ * Not every message queue implementation supports an error handler.
+ *
+ * @param cls closure, same closure as for the message handlers
+ * @param error error code
+ */
+static void
+mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
+{
+  LOG (GNUNET_ERROR_TYPE_WARNING, "consensus service disconnected us\n");
+}
+
+
 /**
  * Create a consensus session.
  *
@@ -192,7 +216,7 @@ GNUNET_CONSENSUS_create (const struct GNUNET_CONFIGURATION_Handle *cfg,
   consensus->session_id = *session_id;
   consensus->client = GNUNET_CLIENT_connect ("consensus", cfg);
   consensus->mq = GNUNET_MQ_queue_for_connection_client (consensus->client,
-                                                         mq_handlers, NULL, consensus);
+                                                         mq_handlers, mq_error_handler, consensus);
 
   GNUNET_assert (consensus->client != NULL);
 
@@ -298,7 +322,12 @@ GNUNET_CONSENSUS_conclude (struct GNUNET_CONSENSUS_Handle *consensus,
 void
 GNUNET_CONSENSUS_destroy (struct GNUNET_CONSENSUS_Handle *consensus)
 {
-  if (consensus->client != NULL)
+  if (NULL != consensus->mq)
+  {
+    GNUNET_MQ_destroy (consensus->mq);
+    consensus->mq = NULL;
+  }
+  if (NULL != consensus->client)
   {
     GNUNET_CLIENT_disconnect (consensus->client);
     consensus->client = NULL;