From 134924d50bf7b1efa08ff2622c4d09576a9f9a39 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 16 Jun 2011 13:08:48 +0000 Subject: do not allow NULL for fn --- src/datacache/datacache.c | 2 +- src/datastore/gnunet-service-datastore.c | 5 +- src/topology/gnunet-daemon-topology.c | 2 +- src/util/container_bloomfilter.c | 80 ++++++++++++++------------------ 4 files changed, 41 insertions(+), 48 deletions(-) diff --git a/src/datacache/datacache.c b/src/datacache/datacache.c index 10b2721ee..b937c63bb 100644 --- a/src/datacache/datacache.c +++ b/src/datacache/datacache.c @@ -163,7 +163,7 @@ GNUNET_DATACACHE_create (const struct GNUNET_CONFIGURATION_Handle *cfg, } else { - ret->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, bf_size, 5); /* approx. 3% false positives at max use */ + ret->filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5); /* approx. 3% false positives at max use */ } ret->stats = GNUNET_STATISTICS_create ("datacache", cfg); diff --git a/src/datastore/gnunet-service-datastore.c b/src/datastore/gnunet-service-datastore.c index 9ae400292..fab403a86 100644 --- a/src/datastore/gnunet-service-datastore.c +++ b/src/datastore/gnunet-service-datastore.c @@ -1664,7 +1664,10 @@ run (void *cls, GNUNET_free_non_null (fn); fn = NULL; } - filter = GNUNET_CONTAINER_bloomfilter_load (fn, bf_size, 5); /* approx. 3% false positives at max use */ + if (fn != NULL) + filter = GNUNET_CONTAINER_bloomfilter_load (fn, bf_size, 5); /* approx. 3% false positives at max use */ + else + filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5); /* approx. 3% false positives at max use */ GNUNET_free_non_null (fn); if (filter == NULL) { diff --git a/src/topology/gnunet-daemon-topology.c b/src/topology/gnunet-daemon-topology.c index ebe19a58d..f7118a058 100644 --- a/src/topology/gnunet-daemon-topology.c +++ b/src/topology/gnunet-daemon-topology.c @@ -511,7 +511,7 @@ setup_filter (struct Peer *peer) "useless" once a HELLO has been passed on to ~100 other peers, which is likely more than enough in any case; hence 64, 5 as bloomfilter parameters. */ - peer->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, 64, 5); + peer->filter = GNUNET_CONTAINER_bloomfilter_init (NULL, 64, 5); peer->filter_expiration = GNUNET_TIME_relative_to_absolute (HELLO_ADVERTISEMENT_MIN_REPEAT_FREQUENCY); /* never send a peer its own HELLO */ GNUNET_CONTAINER_bloomfilter_add (peer->filter, &peer->pid.hashPubKey); diff --git a/src/util/container_bloomfilter.c b/src/util/container_bloomfilter.c index 53eaf31d1..b4c3ad08d 100644 --- a/src/util/container_bloomfilter.c +++ b/src/util/container_bloomfilter.c @@ -437,6 +437,7 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, int i; size_t ui; + GNUNET_assert (NULL != filename); if ((k == 0) || (size == 0)) return NULL; if (size < BUFFSIZE) @@ -448,31 +449,23 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, bf = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_BloomFilter)); /* Try to open a bloomfilter file */ - if (filename != NULL) + bf->fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READWRITE + | GNUNET_DISK_OPEN_CREATE, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE); + if (NULL == bf->fh) { - bf->fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READWRITE - | GNUNET_DISK_OPEN_CREATE, - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE); - if (NULL == bf->fh) - { - GNUNET_free (bf); - return NULL; - } - bf->filename = GNUNET_strdup (filename); - } - else - { - bf->filename = NULL; - bf->fh = NULL; + GNUNET_free (bf); + return NULL; } + bf->filename = GNUNET_strdup (filename); /* Alloc block */ bf->bitArray = GNUNET_malloc_large (size); if (bf->bitArray == NULL) { if (bf->fh != NULL) GNUNET_DISK_file_close (bf->fh); - GNUNET_free_non_null (bf->filename); + GNUNET_free (bf->filename); GNUNET_free (bf); return NULL; } @@ -480,36 +473,33 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, bf->addressesPerElement = k; memset (bf->bitArray, 0, bf->bitArraySize); - if (bf->filename != NULL) + /* Read from the file what bits we can */ + rbuff = GNUNET_malloc (BUFFSIZE); + pos = 0; + while (pos < size * 8) { - /* Read from the file what bits we can */ - rbuff = GNUNET_malloc (BUFFSIZE); - pos = 0; - while (pos < size * 8) - { - int res; - - res = GNUNET_DISK_file_read (bf->fh, rbuff, BUFFSIZE); - if (res == -1) - { - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "read", bf->filename); - } - if (res == 0) - break; /* is ok! we just did not use that many bits yet */ - for (i = 0; i < res; i++) - { - if ((rbuff[i] & 0x0F) != 0) - setBit (bf->bitArray, pos + i * 2); - if ((rbuff[i] & 0xF0) != 0) - setBit (bf->bitArray, pos + i * 2 + 1); - } - if (res < BUFFSIZE) - break; - pos += BUFFSIZE * 2; /* 2 bits per byte in the buffer */ - } - GNUNET_free (rbuff); + int res; + + res = GNUNET_DISK_file_read (bf->fh, rbuff, BUFFSIZE); + if (res == -1) + { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, + "read", bf->filename); + } + if (res == 0) + break; /* is ok! we just did not use that many bits yet */ + for (i = 0; i < res; i++) + { + if ((rbuff[i] & 0x0F) != 0) + setBit (bf->bitArray, pos + i * 2); + if ((rbuff[i] & 0xF0) != 0) + setBit (bf->bitArray, pos + i * 2 + 1); + } + if (res < BUFFSIZE) + break; + pos += BUFFSIZE * 2; /* 2 bits per byte in the buffer */ } + GNUNET_free (rbuff); return bf; } -- cgit v1.2.3