From 4238e624cf345537e26c0111418dcd53bc5c1a97 Mon Sep 17 00:00:00 2001 From: "Nathan S. Evans" Date: Fri, 2 Jul 2010 16:41:31 +0000 Subject: [PATCH] thought realloc was problem, but not properly freeing memory. believe that transport segfault *could* be related to growing connection buffers on demand... appreciate another look if someone has the time (Christian...) --- src/util/connection.c | 14 ++++++++++++-- src/util/server_mst.c | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/util/connection.c b/src/util/connection.c index 7f2787e18..e8a7453d2 100644 --- a/src/util/connection.c +++ b/src/util/connection.c @@ -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); diff --git a/src/util/server_mst.c b/src/util/server_mst.c index 505d98998..5a152be28 100644 --- a/src/util/server_mst.c +++ b/src/util/server_mst.c @@ -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); } -- 2.25.1