fix loopback disconnect signalling and a few memory leaks
authorChristian Grothoff <christian@grothoff.org>
Fri, 17 Feb 2017 20:01:43 +0000 (21:01 +0100)
committerChristian Grothoff <christian@grothoff.org>
Fri, 17 Feb 2017 20:01:43 +0000 (21:01 +0100)
src/cadet/cadet_api_new.c
src/cadet/gnunet-service-cadet-new_channel.c
src/util/client.c

index 8d778e10e46d76106e727d5639736bc7ba8a571d..673764813f49603994abf4a6595585dc2c165f7a 100644 (file)
@@ -346,6 +346,8 @@ destroy_channel (struct GNUNET_CADET_Channel *ch)
   if (NULL != ch->disconnects)
     ch->disconnects (ch->ctx,
                      ch);
+  if (NULL != ch->pending_env)
+    GNUNET_MQ_discard (ch->pending_env);
   GNUNET_MQ_destroy (ch->mq);
   GNUNET_free (ch);
 }
index e94800593341f6d73c086a63f4a045d201f0fe40..828c3daa7bf51270f02dd59ccfa2c0b45670c8de 100644 (file)
@@ -1043,15 +1043,27 @@ GCCH_channel_local_destroy (struct CadetChannel *ch,
     channel_destroy (ch);
     return;
   }
-  if ( (NULL != ch->head_sent) ||
-       (NULL != ch->owner) ||
-       (NULL != ch->dest) )
+  if ( (NULL != ch->head_sent) &&
+       ( (NULL != ch->owner) ||
+         (NULL != ch->dest) ) )
   {
     /* Wait for other end to destroy us as well,
        and otherwise allow send queue to be transmitted first */
     ch->destroy = GNUNET_YES;
     return;
   }
+  if (GNUNET_YES == ch->is_loopback)
+  {
+    struct CadetChannelClient *ccc;
+
+    /* Find which end is left... */
+    ccc = (NULL != ch->owner) ? ch->owner : ch->dest;
+    GSC_handle_remote_channel_destroy (ccc->c,
+                                       ccc->ccn,
+                                       ch);
+    channel_destroy (ch);
+    return;
+  }
   /* If the we ever sent the CHANNEL_CREATE, we need to send a destroy message. */
   switch (ch->state)
   {
index 4fd97104016d325664f5f5a5307a9e759211a5fb..1cf819f9df053111b608d27ad84632ee201476c3 100644 (file)
@@ -510,6 +510,8 @@ try_unixpath (const char *service_name,
       GNUNET_free (unixpath);
       return sock;
     }
+    if (NULL != sock)
+      GNUNET_NETWORK_socket_close (sock);
   }
   GNUNET_free_non_null (unixpath);
 #endif