aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-06-16 13:08:48 +0000
committerChristian Grothoff <christian@grothoff.org>2011-06-16 13:08:48 +0000
commit134924d50bf7b1efa08ff2622c4d09576a9f9a39 (patch)
treeb87e5a8f37971639527253082dc18db7cbc55616
parent93cb17b80c96217bfbbb912c26d7ac7f4edb9e3c (diff)
downloadgnunet-134924d50bf7b1efa08ff2622c4d09576a9f9a39.tar.gz
gnunet-134924d50bf7b1efa08ff2622c4d09576a9f9a39.zip
do not allow NULL for fn
-rw-r--r--src/datacache/datacache.c2
-rw-r--r--src/datastore/gnunet-service-datastore.c5
-rw-r--r--src/topology/gnunet-daemon-topology.c2
-rw-r--r--src/util/container_bloomfilter.c80
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,
163 } 163 }
164 else 164 else
165 { 165 {
166 ret->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, bf_size, 5); /* approx. 3% false positives at max use */ 166 ret->filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5); /* approx. 3% false positives at max use */
167 } 167 }
168 ret->stats = GNUNET_STATISTICS_create ("datacache", 168 ret->stats = GNUNET_STATISTICS_create ("datacache",
169 cfg); 169 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,
1664 GNUNET_free_non_null (fn); 1664 GNUNET_free_non_null (fn);
1665 fn = NULL; 1665 fn = NULL;
1666 } 1666 }
1667 filter = GNUNET_CONTAINER_bloomfilter_load (fn, bf_size, 5); /* approx. 3% false positives at max use */ 1667 if (fn != NULL)
1668 filter = GNUNET_CONTAINER_bloomfilter_load (fn, bf_size, 5); /* approx. 3% false positives at max use */
1669 else
1670 filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5); /* approx. 3% false positives at max use */
1668 GNUNET_free_non_null (fn); 1671 GNUNET_free_non_null (fn);
1669 if (filter == NULL) 1672 if (filter == NULL)
1670 { 1673 {
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)
511 "useless" once a HELLO has been passed on to ~100 511 "useless" once a HELLO has been passed on to ~100
512 other peers, which is likely more than enough in 512 other peers, which is likely more than enough in
513 any case; hence 64, 5 as bloomfilter parameters. */ 513 any case; hence 64, 5 as bloomfilter parameters. */
514 peer->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, 64, 5); 514 peer->filter = GNUNET_CONTAINER_bloomfilter_init (NULL, 64, 5);
515 peer->filter_expiration = GNUNET_TIME_relative_to_absolute (HELLO_ADVERTISEMENT_MIN_REPEAT_FREQUENCY); 515 peer->filter_expiration = GNUNET_TIME_relative_to_absolute (HELLO_ADVERTISEMENT_MIN_REPEAT_FREQUENCY);
516 /* never send a peer its own HELLO */ 516 /* never send a peer its own HELLO */
517 GNUNET_CONTAINER_bloomfilter_add (peer->filter, &peer->pid.hashPubKey); 517 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,
437 int i; 437 int i;
438 size_t ui; 438 size_t ui;
439 439
440 GNUNET_assert (NULL != filename);
440 if ((k == 0) || (size == 0)) 441 if ((k == 0) || (size == 0))
441 return NULL; 442 return NULL;
442 if (size < BUFFSIZE) 443 if (size < BUFFSIZE)
@@ -448,31 +449,23 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename,
448 449
449 bf = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_BloomFilter)); 450 bf = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_BloomFilter));
450 /* Try to open a bloomfilter file */ 451 /* Try to open a bloomfilter file */
451 if (filename != NULL) 452 bf->fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READWRITE
453 | GNUNET_DISK_OPEN_CREATE,
454 GNUNET_DISK_PERM_USER_READ |
455 GNUNET_DISK_PERM_USER_WRITE);
456 if (NULL == bf->fh)
452 { 457 {
453 bf->fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READWRITE 458 GNUNET_free (bf);
454 | GNUNET_DISK_OPEN_CREATE, 459 return NULL;
455 GNUNET_DISK_PERM_USER_READ |
456 GNUNET_DISK_PERM_USER_WRITE);
457 if (NULL == bf->fh)
458 {
459 GNUNET_free (bf);
460 return NULL;
461 }
462 bf->filename = GNUNET_strdup (filename);
463 }
464 else
465 {
466 bf->filename = NULL;
467 bf->fh = NULL;
468 } 460 }
461 bf->filename = GNUNET_strdup (filename);
469 /* Alloc block */ 462 /* Alloc block */
470 bf->bitArray = GNUNET_malloc_large (size); 463 bf->bitArray = GNUNET_malloc_large (size);
471 if (bf->bitArray == NULL) 464 if (bf->bitArray == NULL)
472 { 465 {
473 if (bf->fh != NULL) 466 if (bf->fh != NULL)
474 GNUNET_DISK_file_close (bf->fh); 467 GNUNET_DISK_file_close (bf->fh);
475 GNUNET_free_non_null (bf->filename); 468 GNUNET_free (bf->filename);
476 GNUNET_free (bf); 469 GNUNET_free (bf);
477 return NULL; 470 return NULL;
478 } 471 }
@@ -480,36 +473,33 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename,
480 bf->addressesPerElement = k; 473 bf->addressesPerElement = k;
481 memset (bf->bitArray, 0, bf->bitArraySize); 474 memset (bf->bitArray, 0, bf->bitArraySize);
482 475
483 if (bf->filename != NULL) 476 /* Read from the file what bits we can */
477 rbuff = GNUNET_malloc (BUFFSIZE);
478 pos = 0;
479 while (pos < size * 8)
484 { 480 {
485 /* Read from the file what bits we can */ 481 int res;
486 rbuff = GNUNET_malloc (BUFFSIZE); 482
487 pos = 0; 483 res = GNUNET_DISK_file_read (bf->fh, rbuff, BUFFSIZE);
488 while (pos < size * 8) 484 if (res == -1)
489 { 485 {
490 int res; 486 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
491 487 "read", bf->filename);
492 res = GNUNET_DISK_file_read (bf->fh, rbuff, BUFFSIZE); 488 }
493 if (res == -1) 489 if (res == 0)
494 { 490 break; /* is ok! we just did not use that many bits yet */
495 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, 491 for (i = 0; i < res; i++)
496 "read", bf->filename); 492 {
497 } 493 if ((rbuff[i] & 0x0F) != 0)
498 if (res == 0) 494 setBit (bf->bitArray, pos + i * 2);
499 break; /* is ok! we just did not use that many bits yet */ 495 if ((rbuff[i] & 0xF0) != 0)
500 for (i = 0; i < res; i++) 496 setBit (bf->bitArray, pos + i * 2 + 1);
501 { 497 }
502 if ((rbuff[i] & 0x0F) != 0) 498 if (res < BUFFSIZE)
503 setBit (bf->bitArray, pos + i * 2); 499 break;
504 if ((rbuff[i] & 0xF0) != 0) 500 pos += BUFFSIZE * 2; /* 2 bits per byte in the buffer */
505 setBit (bf->bitArray, pos + i * 2 + 1);
506 }
507 if (res < BUFFSIZE)
508 break;
509 pos += BUFFSIZE * 2; /* 2 bits per byte in the buffer */
510 }
511 GNUNET_free (rbuff);
512 } 501 }
502 GNUNET_free (rbuff);
513 return bf; 503 return bf;
514} 504}
515 505