- fix crashes
authorMatthias Wachs <wachs@net.in.tum.de>
Tue, 8 May 2012 12:35:29 +0000 (12:35 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Tue, 8 May 2012 12:35:29 +0000 (12:35 +0000)
src/transport/plugin_transport_udp.c
src/transport/plugin_transport_udp_broadcasting.c

index 905b7f995a4510181a1b550698e6b846f447fcde..9a99fc556d28b4b5c51ec7660042926675d0065b 100644 (file)
@@ -1521,17 +1521,19 @@ static void read_process_ack (struct Plugin *plugin,
   s->last_expected_delay = GNUNET_FRAGMENT_context_destroy (s->frag_ctx->frag);
 
   struct UDPMessageWrapper * udpw = NULL;
+  struct UDPMessageWrapper * tmp = NULL;
   if (s->addrlen == sizeof (struct sockaddr_in6))
   {
     udpw = plugin->ipv6_queue_head;
     while (udpw!= NULL)
     {
+      tmp = udpw->next;
       if ((udpw->frag_ctx != NULL) && (udpw->frag_ctx == s->frag_ctx))
       {
         GNUNET_CONTAINER_DLL_remove(plugin->ipv6_queue_head, plugin->ipv6_queue_tail, udpw);
         GNUNET_free (udpw);
       }
-      udpw = udpw->next;
+      udpw = tmp;
     }
   }
   if (s->addrlen == sizeof (struct sockaddr_in))
@@ -1539,12 +1541,13 @@ static void read_process_ack (struct Plugin *plugin,
     udpw = plugin->ipv4_queue_head;
     while (udpw!= NULL)
     {
+      tmp = udpw->next;
       if ((udpw->frag_ctx != NULL) && (udpw->frag_ctx == s->frag_ctx))
       {
         GNUNET_CONTAINER_DLL_remove(plugin->ipv4_queue_head, plugin->ipv4_queue_tail, udpw);
         GNUNET_free (udpw);
       }
-      udpw = udpw->next;
+      udpw = tmp;
     }
   }
 
index 623cde2bda8921bf7e8d9d375271bd41f64474c1..2935d8da390adc74a8227564254f2a2128391dca 100644 (file)
@@ -175,7 +175,7 @@ udp_broadcast_receive (struct Plugin *plugin, const char * buf, ssize_t size, st
 {
   struct GNUNET_ATS_Information ats;
 
-  if (addrlen == sizeof (struct sockaddr_in))
+  if ((GNUNET_YES == plugin->broadcast_ipv4) && (addrlen == sizeof (struct sockaddr_in)))
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Received IPv4 HELLO beacon broadcast with %i bytes from address %s\n",
@@ -189,12 +189,14 @@ udp_broadcast_receive (struct Plugin *plugin, const char * buf, ssize_t size, st
     mc->addr.u4_port = av4->sin_port;
     ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) addr, addrlen);
     mc->ats_address_network_type = ats.value;
+
+    GNUNET_assert (NULL != plugin->broadcast_ipv4_mst);
     if (GNUNET_OK !=
         GNUNET_SERVER_mst_receive (plugin->broadcast_ipv4_mst, mc, buf, size,
                                    GNUNET_NO, GNUNET_NO))
       GNUNET_free (mc);
   }
-  else if (addrlen == sizeof (struct sockaddr_in6))
+  else if ((GNUNET_YES == plugin->broadcast_ipv4) && (addrlen == sizeof (struct sockaddr_in6)))
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Received IPv6 HELLO beacon broadcast with %i bytes from address %s\n",
@@ -208,7 +210,7 @@ udp_broadcast_receive (struct Plugin *plugin, const char * buf, ssize_t size, st
     mc->addr.u6_port = av6->sin6_port;
     ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) addr, addrlen);
     mc->ats_address_network_type = ats.value;
-
+    GNUNET_assert (NULL != plugin->broadcast_ipv4_mst);
     if (GNUNET_OK !=
         GNUNET_SERVER_mst_receive (plugin->broadcast_ipv6_mst, mc, buf, size,
                                    GNUNET_NO, GNUNET_NO))