sanity checks
authorSchanzenbach, Martin <mschanzenbach@posteo.de>
Wed, 27 Feb 2019 21:15:30 +0000 (22:15 +0100)
committerSchanzenbach, Martin <mschanzenbach@posteo.de>
Wed, 27 Feb 2019 21:15:30 +0000 (22:15 +0100)
src/cadet/gnunet-service-cadet_channel.c

index cd5093c468b59530b5531f62dbf7180446d4e117..1746fc509aef859ac7ce50e5ea5c39d94a92ccab 100644 (file)
@@ -1410,7 +1410,8 @@ GCCH_handle_channel_plaintext_data (struct CadetChannel *ch,
      * We always send if possible in this case.
      * It is guaranteed that the queued MID < received MID
      **/
-    if (GNUNET_YES == ccc->client_ready)
+    if ((NULL != ccc->head_recv) &&
+        (GNUNET_YES == ccc->client_ready))
     {
       next_msg = ccc->head_recv;
       LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -1429,12 +1430,11 @@ GCCH_handle_channel_plaintext_data (struct CadetChannel *ch,
                                    next_msg);
       ccc->num_recv--;
       /* Do not process duplicate MID */
-      if ((msg->mid.mid == next_msg->mid.mid) || /* Duplicate */
-          (ntohl (msg->mid.mid) < ntohl (ch->mid_recv.mid))) /* Old */
+      if (msg->mid.mid == next_msg->mid.mid) /* Duplicate */
       {
         /* Duplicate within the queue, drop */
         LOG (GNUNET_ERROR_TYPE_DEBUG,
-             "Message on %s (mid %u) dropped\n",
+             "Message on %s (mid %u) dropped, duplicate\n",
              GCCH_2s (ch),
              ntohl (msg->mid.mid));
         GNUNET_free (next_msg);
@@ -1444,6 +1444,17 @@ GCCH_handle_channel_plaintext_data (struct CadetChannel *ch,
       GNUNET_free (next_msg);
     }
 
+    if (ntohl (msg->mid.mid) < ntohl (ch->mid_recv.mid)) /* Old */
+    {
+      /* Duplicate within the queue, drop */
+      LOG (GNUNET_ERROR_TYPE_DEBUG,
+           "Message on %s (mid %u) dropped, old.\n",
+           GCCH_2s (ch),
+           ntohl (msg->mid.mid));
+      GNUNET_MQ_discard (env);
+      return;
+    }
+
     /* Channel is unreliable, so we do not ACK. But we also cannot
        allow buffering everything, so check if we have space... */
     if (ccc->num_recv >= ch->max_pending_messages)