From edb04e6d8bfe68dddf6968ec37cf39ea3a47feab Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 30 Jul 2013 16:10:06 -0700 Subject: [PATCH] fix segfault that could be caused by merging an empty bloom-filter with a bloom-filter already containing values. I assume that it is ok to merge an empty bloom-filter with any bloom-filter - if not we have to change the patch to return an error in this case. --- src/OpaqueVal.cc | 5 ++++- src/probabilistic/bloom-filter.bif | 5 ++++- testing/btest/Baseline/bifs.bloomfilter/output | 1 + testing/btest/bifs/bloomfilter.bro | 5 +++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/OpaqueVal.cc b/src/OpaqueVal.cc index 66b3c081e7..2b3236203b 100644 --- a/src/OpaqueVal.cc +++ b/src/OpaqueVal.cc @@ -591,7 +591,10 @@ bool BloomFilterVal::Empty() const BloomFilterVal* BloomFilterVal::Merge(const BloomFilterVal* x, const BloomFilterVal* y) { - if ( ! same_type(x->Type(), y->Type()) ) + if ( ( x->Type() != y->Type() ) && // both 0 is ok + ( x->Type() != 0 ) && // any one 0 also is ok + ( y->Type() != 0 ) && + ! same_type(x->Type(), y->Type()) ) { reporter->Error("cannot merge Bloom filters with different types"); return 0; diff --git a/src/probabilistic/bloom-filter.bif b/src/probabilistic/bloom-filter.bif index a3567ad6f7..5b06f95673 100644 --- a/src/probabilistic/bloom-filter.bif +++ b/src/probabilistic/bloom-filter.bif @@ -186,7 +186,10 @@ function bloomfilter_merge%(bf1: opaque of bloomfilter, const BloomFilterVal* bfv1 = static_cast(bf1); const BloomFilterVal* bfv2 = static_cast(bf2); - if ( ! same_type(bfv1->Type(), bfv2->Type()) ) + if ( ( bfv1->Type() != bfv2->Type() ) && // both 0 is ok + (bfv1->Type() != 0) && + (bfv2->Type() != 0) && + ! same_type(bfv1->Type(), bfv2->Type()) ) { reporter->Error("incompatible Bloom filter types"); return 0; diff --git a/testing/btest/Baseline/bifs.bloomfilter/output b/testing/btest/Baseline/bifs.bloomfilter/output index 14e1f038c0..991308e10b 100644 --- a/testing/btest/Baseline/bifs.bloomfilter/output +++ b/testing/btest/Baseline/bifs.bloomfilter/output @@ -17,6 +17,7 @@ error: false-positive rate must take value between 0 and 1 1 1 1 +1 2 3 3 diff --git a/testing/btest/bifs/bloomfilter.bro b/testing/btest/bifs/bloomfilter.bro index 3b40f29553..f2c882d175 100644 --- a/testing/btest/bifs/bloomfilter.bro +++ b/testing/btest/bifs/bloomfilter.bro @@ -45,6 +45,11 @@ function test_basic_bloom_filter() print bloomfilter_lookup(bf_merged, 84); print bloomfilter_lookup(bf_merged, 100); print bloomfilter_lookup(bf_merged, 168); + + #empty filter tests + local bf_empty = bloomfilter_basic_init(0.1, 1000); + local bf_empty_merged = bloomfilter_merge(bf_merged, bf_empty); + print bloomfilter_lookup(bf_empty_merged, 42); } function test_counting_bloom_filter()