From ba9c0e16195d8468f0a9c080e658f3d3f2131c6a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 2 Jul 2010 21:05:43 +0000 Subject: [PATCH] fixing calculations and code for buffer realloc --- src/util/common_allocation.c | 2 ++ src/util/connection.c | 21 ++++----------------- src/util/server_mst.c | 34 +++++++++++++--------------------- 3 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/util/common_allocation.c b/src/util/common_allocation.c index e62c12d08..21c4690bf 100644 --- a/src/util/common_allocation.c +++ b/src/util/common_allocation.c @@ -103,6 +103,7 @@ GNUNET_xmalloc_unchecked_ (size_t size, const char *filename, int linenumber) return result; } + /** * Reallocate memory. Checks the return value, aborts if no more * memory is available. @@ -139,6 +140,7 @@ GNUNET_xrealloc_ (void *ptr, return ptr; } + /** * Free memory. Merely a wrapper for the case that we * want to keep track of allocations. diff --git a/src/util/connection.c b/src/util/connection.c index e8a7453d2..57720c07e 100644 --- a/src/util/connection.c +++ b/src/util/connection.c @@ -1586,27 +1586,14 @@ GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle GNUNET_CONNECTION_TransmitReadyNotify 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)) + GNUNET_assert (size < GNUNET_SERVER_MAX_MESSAGE_SIZE); + if (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; + sock->write_buffer = GNUNET_realloc(sock->write_buffer, size); + sock->write_buffer_size = size; } GNUNET_assert (sock->write_buffer_size >= size); GNUNET_assert (sock->write_buffer_off <= sock->write_buffer_size); diff --git a/src/util/server_mst.c b/src/util/server_mst.c index 5a152be28..0856ba576 100644 --- a/src/util/server_mst.c +++ b/src/util/server_mst.c @@ -129,14 +129,9 @@ 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; - size_t newsize; #if DEBUG_SERVER_MST GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -144,22 +139,6 @@ GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst, (unsigned int) size, (unsigned int) (mst->pos - mst->off)); #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 + 1; /* How much space do we need? */ - if (newsize >= 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; - } - ret = GNUNET_OK; ibuf = (char*)mst->hdr; while (mst->pos > 0) @@ -211,6 +190,13 @@ GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst, mst->pos); mst->off = 0; } + if (want > mst->curr_buf) + { + mst->hdr = GNUNET_realloc(mst->hdr, want); + ibuf = (char*)mst->hdr; + mst->curr_buf = want; + } + hdr = (const struct GNUNET_MessageHeader*) &ibuf[mst->off]; if (mst->pos - mst->off < want) { delta = GNUNET_MIN (want - (mst->pos - mst->off), @@ -290,6 +276,12 @@ GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst, copy: if ( (size > 0) && (! purge) ) { + if (size + mst->pos > mst->curr_buf) + { + mst->hdr = GNUNET_realloc(mst->hdr, size + mst->pos); + ibuf = (char*)mst->hdr; + mst->curr_buf = size + mst->pos; + } GNUNET_assert (mst->pos + size <= mst->curr_buf); memcpy (&ibuf[mst->pos], buf, size); mst->pos += size; -- 2.25.1