aboutsummaryrefslogtreecommitdiff
path: root/src/util/container_bloomfilter.c
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 /src/util/container_bloomfilter.c
parent93cb17b80c96217bfbbb912c26d7ac7f4edb9e3c (diff)
downloadgnunet-134924d50bf7b1efa08ff2622c4d09576a9f9a39.tar.gz
gnunet-134924d50bf7b1efa08ff2622c4d09576a9f9a39.zip
do not allow NULL for fn
Diffstat (limited to 'src/util/container_bloomfilter.c')
-rw-r--r--src/util/container_bloomfilter.c80
1 files changed, 35 insertions, 45 deletions
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