thought realloc was problem, but not properly freeing memory. believe that transport...
authorNathan S. Evans <evans@in.tum.de>
Fri, 2 Jul 2010 16:41:31 +0000 (16:41 +0000)
committerNathan S. Evans <evans@in.tum.de>
Fri, 2 Jul 2010 16:41:31 +0000 (16:41 +0000)
src/util/connection.c
src/util/server_mst.c

index 7f2787e18096bf90536e7331884169b0af6e9830..e8a7453d2b8e7fdea73c54492556f5471d06d21a 100644 (file)
@@ -556,6 +556,7 @@ destroy_continuation (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Freeing memory of connection %p.\n", sock);
 #endif
+  GNUNET_free (sock->write_buffer);
   GNUNET_free (sock);
 }
 
@@ -1586,16 +1587,25 @@ GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle
                                          notify, void *notify_cls)
 {
   size_t temp_size;
+#if !REALLOC
+  char *temp_buf;
+#endif
   if (sock->nth.notify_ready != NULL)
     return NULL;
   GNUNET_assert (notify != NULL);
   if ((sock->write_buffer_size < size) && (size < GNUNET_SERVER_MAX_MESSAGE_SIZE))
     {
-      temp_size = sock->write_buffer_size + size;
+      temp_size = sock->write_buffer_size + size + 1;
       if (temp_size >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
         temp_size = GNUNET_SERVER_MAX_MESSAGE_SIZE;
-
+#if REALLOC
       sock->write_buffer = GNUNET_realloc(sock->write_buffer, temp_size);
+#else
+      temp_buf = GNUNET_malloc(temp_size);
+      memcpy(temp_buf, sock->write_buffer, sock->write_buffer_size);
+      GNUNET_free(sock->write_buffer);
+      sock->write_buffer = temp_buf;
+#endif
       sock->write_buffer_size = temp_size;
     }
   GNUNET_assert (sock->write_buffer_size >= size);
index 505d98998e2ccdc7ee80f0732dd75e68b08482fd..5a152be2820a8c17d339b0bc344be9730799844b 100644 (file)
@@ -129,6 +129,10 @@ GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
   size_t delta;
   uint16_t want;
   char *ibuf;
+
+#if !REALLOC
+  char *temp_buf;
+#endif
   int need_align;
   unsigned long offset;
   int ret;
@@ -142,11 +146,17 @@ GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
 #endif
   if ((size > mst->curr_buf) && (size < GNUNET_SERVER_MAX_MESSAGE_SIZE)) /* Received bigger message than we can currently handle! */
     {
-      newsize = mst->curr_buf + size; /* How much space do we need? */
+      newsize = mst->curr_buf + size + 1; /* How much space do we need? */
       if (newsize >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
-        newsize = GNUNET_SERVER_MAX_MESSAGE_SIZE; /* Check it's not bigger than GNUNET_SERVER_MAX_MESSAGE_SIZE */
-
+        newsize = GNUNET_SERVER_MAX_MESSAGE_SIZE - 1; /* Check it's not bigger than GNUNET_SERVER_MAX_MESSAGE_SIZE */
+#if REALLOC
       mst->hdr = GNUNET_realloc(mst->hdr, newsize);
+#else
+      temp_buf = GNUNET_malloc(newsize);
+      memcpy(temp_buf, mst->hdr, mst->curr_buf);
+      GNUNET_free(mst->hdr);
+      mst->hdr = temp_buf;
+#endif
       mst->curr_buf = newsize;
     }
 
@@ -303,6 +313,7 @@ GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
 void
 GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst)
 {
+  GNUNET_free (mst->hdr);
   GNUNET_free (mst);
 }