gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r34453 - gnunet/src/set


From: gnunet
Subject: [GNUnet-SVN] r34453 - gnunet/src/set
Date: Sun, 30 Nov 2014 01:44:57 +0100

Author: grothoff
Date: 2014-11-30 01:44:56 +0100 (Sun, 30 Nov 2014)
New Revision: 34453

Modified:
   gnunet/src/set/gnunet-service-set.c
   gnunet/src/set/gnunet-service-set_intersection.c
   gnunet/src/set/set_api.c
   gnunet/src/set/test_set_intersection_result_full.c
Log:
-avoid use after free during set intersection completion

Modified: gnunet/src/set/gnunet-service-set.c
===================================================================
--- gnunet/src/set/gnunet-service-set.c 2014-11-30 00:21:56 UTC (rev 34452)
+++ gnunet/src/set/gnunet-service-set.c 2014-11-30 00:44:56 UTC (rev 34453)
@@ -1458,7 +1458,8 @@
  * @param cfg configuration to use
  */
 static void
-run (void *cls, struct GNUNET_SERVER_Handle *server,
+run (void *cls,
+     struct GNUNET_SERVER_Handle *server,
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
   static const struct GNUNET_SERVER_MessageHandler server_handlers[] = {

Modified: gnunet/src/set/gnunet-service-set_intersection.c
===================================================================
--- gnunet/src/set/gnunet-service-set_intersection.c    2014-11-30 00:21:56 UTC 
(rev 34452)
+++ gnunet/src/set/gnunet-service-set_intersection.c    2014-11-30 00:44:56 UTC 
(rev 34453)
@@ -549,13 +549,15 @@
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Sending done and destroy because iterator ran out\n");
+    op->keep = GNUNET_NO;
     send_client_done_and_destroy (op);
     return;
   }
   ee = nxt;
   element = &ee->element;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Sending element (size %u) to client (full set)\n",
+              "Sending element %s:%u to client (full set)\n",
+              GNUNET_h2s (&ee->element_hash),
               element->size);
   GNUNET_assert (0 != op->spec->client_request_id);
   ev = GNUNET_MQ_msg_extra (rm,
@@ -901,9 +903,11 @@
   if (GNUNET_SET_RESULT_FULL == op->spec->result_mode)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Sending full result set\n");
+                "Sending full result set (%u elements)\n",
+                GNUNET_CONTAINER_multihashmap_size (op->state->my_elements));
     op->state->full_result_iter
       = GNUNET_CONTAINER_multihashmap_iterator_create (op->state->my_elements);
+    op->keep = GNUNET_YES;
     send_remaining_elements (op);
     return;
   }
@@ -993,7 +997,8 @@
     return;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Got final DONE\n");
+              "Got IntersectionDoneMessage, have %u elements in 
intersection\n",
+              op->state->my_element_count);
   op->state->phase = PHASE_FINISHED;
   finish_and_destroy (op);
 }

Modified: gnunet/src/set/set_api.c
===================================================================
--- gnunet/src/set/set_api.c    2014-11-30 00:21:56 UTC (rev 34452)
+++ gnunet/src/set/set_api.c    2014-11-30 00:44:56 UTC (rev 34453)
@@ -306,6 +306,10 @@
   msg = (const struct GNUNET_SET_ResultMessage *) mh;
   GNUNET_assert (NULL != set->mq);
   result_status = ntohs (msg->result_status);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Got result message with status %d\n",
+       result_status);
+
   oh = GNUNET_MQ_assoc_get (set->mq,
                             ntohl (msg->request_id));
   if (NULL == oh)
@@ -331,6 +335,19 @@
       oh->result_cb (oh->result_cls,
                      NULL,
                      result_status);
+    switch (result_status)
+    {
+    case GNUNET_SET_STATUS_OK:
+      break;
+    case GNUNET_SET_STATUS_FAILURE:
+      oh->result_cb = NULL;
+      break;
+    case GNUNET_SET_STATUS_HALF_DONE:
+      break;
+    case GNUNET_SET_STATUS_DONE:
+      oh->result_cb = NULL;
+      break;
+    }
     GNUNET_free (oh);
     return;
   }
@@ -417,7 +434,8 @@
   struct GNUNET_SET_Handle *set = cls;
 
   LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Handling client set error\n");
+       "Handling client set error %d\n",
+       error);
   while (NULL != set->ops_head)
   {
     if (NULL != set->ops_head->result_cb)
@@ -479,7 +497,8 @@
   }
   set->mq = GNUNET_MQ_queue_for_connection_client (set->client,
                                                    mq_handlers,
-                                                   &handle_client_set_error, 
set);
+                                                   &handle_client_set_error,
+                                                   set);
   GNUNET_assert (NULL != set->mq);
   mqm = GNUNET_MQ_msg (msg,
                        GNUNET_MESSAGE_TYPE_SET_CREATE);

Modified: gnunet/src/set/test_set_intersection_result_full.c
===================================================================
--- gnunet/src/set/test_set_intersection_result_full.c  2014-11-30 00:21:56 UTC 
(rev 34452)
+++ gnunet/src/set/test_set_intersection_result_full.c  2014-11-30 00:44:56 UTC 
(rev 34453)
@@ -53,6 +53,7 @@
                 enum GNUNET_SET_Status status)
 {
   static int count;
+
   switch (status)
   {
   case GNUNET_SET_STATUS_OK:




reply via email to

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