diff --git a/CHANGES b/CHANGES index 693dc36dac..e9b5b1c925 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,9 @@ +2.1-948 | 2013-07-31 20:08:28 -0700 + + * Fix segfault caused by merging an empty bloom-filter with a + bloom-filter already containing values. (Bernhard Amann) + 2.1-945 | 2013-07-30 10:05:10 -0700 * Make hashers serializable. (Matthias Vallentin) diff --git a/VERSION b/VERSION index 6b605113b8..aaa6984d5f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1-945 +2.1-948 diff --git a/src/OpaqueVal.cc b/src/OpaqueVal.cc index 66b3c081e7..6939362ab8 100644 --- a/src/OpaqueVal.cc +++ b/src/OpaqueVal.cc @@ -591,7 +591,9 @@ bool BloomFilterVal::Empty() const BloomFilterVal* BloomFilterVal::Merge(const BloomFilterVal* x, const BloomFilterVal* y) { - if ( ! same_type(x->Type(), y->Type()) ) + if ( x->Type() && // any one 0 is ok here + y->Type() && + ! same_type(x->Type(), y->Type()) ) { reporter->Error("cannot merge Bloom filters with different types"); return 0; @@ -613,7 +615,7 @@ BloomFilterVal* BloomFilterVal::Merge(const BloomFilterVal* x, BloomFilterVal* merged = new BloomFilterVal(copy); - if ( ! merged->Typify(x->Type()) ) + if ( x->Type() && ! merged->Typify(x->Type()) ) { reporter->Error("failed to set type on merged Bloom filter"); return 0; diff --git a/src/probabilistic/bloom-filter.bif b/src/probabilistic/bloom-filter.bif index a3567ad6f7..1797f941d2 100644 --- a/src/probabilistic/bloom-filter.bif +++ b/src/probabilistic/bloom-filter.bif @@ -186,7 +186,9 @@ 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() && // any one 0 is ok here + bfv2->Type() && + ! 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()