From 3f29625866332d29e3ad666b35d8c7c3006f95d1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 6 May 2018 21:32:36 +0200 Subject: fix dht profiler memory leak --- src/dht/gnunet_dht_profiler.c | 76 ++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 41 deletions(-) (limited to 'src/dht') diff --git a/src/dht/gnunet_dht_profiler.c b/src/dht/gnunet_dht_profiler.c index bc75b67f5..477f33bf6 100644 --- a/src/dht/gnunet_dht_profiler.c +++ b/src/dht/gnunet_dht_profiler.c @@ -93,11 +93,6 @@ struct ActiveContext */ struct GNUNET_DHT_Handle *dht; - /** - * The data used for do a PUT. Will be NULL if a PUT hasn't been performed yet - */ - void *put_data; - /** * The active context used for our DHT GET */ @@ -114,9 +109,10 @@ struct ActiveContext struct GNUNET_DHT_GetHandle *dht_get; /** - * The hash of the @e put_data + * The hashes of the values stored via this activity context. + * Array of length #num_puts_per_peer. */ - struct GNUNET_HashCode hash; + struct GNUNET_HashCode *hash; /** * Delay task @@ -128,11 +124,6 @@ struct ActiveContext */ unsigned int put_count; - /** - * The size of the @e put_data - */ - uint16_t put_data_size; - /** * The number of peers currently doing GET on our data */ @@ -265,11 +256,6 @@ static unsigned int total_put_path_length; */ static unsigned int total_get_path_length; -/** - * List of all the peers contexts. - */ -struct Context **peer_contexts = NULL; - /** * Counter to keep track of peers added to peer_context lists. */ @@ -320,8 +306,8 @@ do_shutdown (void *cls) { if (NULL != ac->delay_task) GNUNET_SCHEDULER_cancel (ac->delay_task); - if (NULL != ac->put_data) - GNUNET_free (ac->put_data); + if (NULL != ac->hash) + free (ac->hash); if (NULL != ac->dht_put) GNUNET_DHT_put_cancel (ac->dht_put); if (NULL != ac->dht_get) @@ -496,10 +482,6 @@ get_iter (void *cls, struct ActiveContext *get_ac = ac->get_ac; struct Context *ctx = ac->ctx; - /* Check the keys of put and get match or not. */ - GNUNET_assert (0 == memcmp (key, - &get_ac->hash, - sizeof (struct GNUNET_HashCode))); /* we found the data we are looking for */ DEBUG ("We found a GET request; %u remaining\n", n_gets - (n_gets_fail + n_gets_ok)); //FIXME: It always prints 1. @@ -547,21 +529,23 @@ delayed_get (void *cls) r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, n_active); get_ac = &a_ac[r]; - if (NULL != get_ac->put_data) + if (NULL != get_ac->hash) break; } get_ac->nrefs++; ac->get_ac = get_ac; + r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, + num_puts_per_peer); DEBUG ("GET_REQUEST_START key %s \n", - GNUNET_h2s((struct GNUNET_HashCode *) ac->put_data)); + GNUNET_h2s(&get_ac->hash[r])); ac->dht_get = GNUNET_DHT_get_start (ac->dht, GNUNET_BLOCK_TYPE_TEST, - &get_ac->hash, + &get_ac->hash[r], 1, /* replication level */ GNUNET_DHT_RO_NONE, NULL, 0, /* extended query and size */ - get_iter, + &get_iter, ac); /* GET iterator and closure */ n_gets++; @@ -612,6 +596,8 @@ static void delayed_put (void *cls) { struct ActiveContext *ac = cls; + char block[65536]; + size_t block_size; ac->delay_task = NULL; if (0 == ac->put_count) @@ -628,26 +614,25 @@ delayed_put (void *cls) /* Generate and DHT PUT some random data */ - ac->put_data_size = 16; /* minimum */ - ac->put_data_size += GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, - (63*1024)); - ac->put_data = GNUNET_malloc (ac->put_data_size); + block_size = 16; /* minimum */ + block_size += GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, + (63*1024)); GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, - ac->put_data, - ac->put_data_size); - GNUNET_CRYPTO_hash (ac->put_data, - ac->put_data_size, - &ac->hash); - DEBUG ("PUT_REQUEST_START key %s\n", - GNUNET_h2s ((struct GNUNET_HashCode *)ac->put_data)); + block, + block_size); ac->put_count--; + GNUNET_CRYPTO_hash (block, + block_size, + &ac->hash[ac->put_count]); + DEBUG ("PUT_REQUEST_START key %s\n", + GNUNET_h2s (&ac->hash[ac->put_count])); ac->dht_put = GNUNET_DHT_put (ac->dht, - &ac->hash, + &ac->hash[ac->put_count], replication, GNUNET_DHT_RO_RECORD_ROUTE, GNUNET_BLOCK_TYPE_TEST, - ac->put_data_size, - ac->put_data, + block_size, + block, GNUNET_TIME_UNIT_FOREVER_ABS, /* expiration time */ &put_cont, ac); /* continuation and its closure */ @@ -696,6 +681,15 @@ dht_connected (void *cls, GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, delay_put.rel_value_us); ac->put_count = num_puts_per_peer; + ac->hash = calloc (ac->put_count, + sizeof (struct GNUNET_HashCode)); + if (NULL == ac->hash) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "calloc"); + GNUNET_SCHEDULER_shutdown (); + return; + } ac->delay_task = GNUNET_SCHEDULER_add_delayed (peer_delay_put, &delayed_put, ac); -- cgit v1.2.3