From 1a41bfa0ef0bf2a8fc1829388a350609f98a6a42 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Mon, 29 Apr 2013 20:37:26 -0700 Subject: [PATCH 1/2] Fixing memory leak in CompHash. Amazing what code still has memory leaks ... Closes #987. --- src/CompHash.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/CompHash.cc b/src/CompHash.cc index 05d3e515d2..202ddf6305 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -830,7 +830,10 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0, } for ( int i = 0; i < n; ++i ) + { tv->Assign(keys[i], t->IsSet() ? 0 : values[i]); + Unref(keys[i]); + } pval = tv; } From a201d2e033646d6d77741270bd0bc952e221c840 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Mon, 29 Apr 2013 21:10:59 -0700 Subject: [PATCH 2/2] Fixing more memory leaks. --- CHANGES | 5 +++++ VERSION | 2 +- src/CompHash.cc | 25 ++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 03dd47d3e9..e3d20b84b6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,9 @@ +2.1-397 | 2013-04-29 21:19:00 -0700 + + * Fixing memory leaks in CompHash implementation. Addresses #987. + (Robin Sommer) + 2.1-394 | 2013-04-27 15:02:31 -0700 * Fixed a bug in the vulnerable software script and added a test. diff --git a/VERSION b/VERSION index 962239ea7b..4809e9f2e9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1-394 +2.1-397 diff --git a/src/CompHash.cc b/src/CompHash.cc index 202ddf6305..e793a104e0 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -77,7 +77,7 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0, *kp = ( v ? 1 : 0); kp0 = reinterpret_cast(kp+1); - if ( ! v ) + if ( ! v ) return kp0; } @@ -181,16 +181,24 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0, Val* key = lv->Index(i); if ( ! (kp1 = SingleValHash(type_check, kp1, key->Type(), key, false)) ) + { + Unref(lv); return 0; + } if ( ! v->Type()->IsSet() ) { Val* val = tv->Lookup(key); if ( ! (kp1 = SingleValHash(type_check, kp1, val->Type(), val, false)) ) + { + Unref(lv); return 0; + } } } + + Unref(lv); } break; @@ -454,16 +462,27 @@ int CompositeHash::SingleTypeKeySize(BroType* bt, const Val* v, Val* key = lv->Index(i); sz = SingleTypeKeySize(key->Type(), key, type_check, sz, false, calc_static_size); - if ( ! sz ) return 0; + if ( ! sz ) + { + Unref(lv); + return 0; + } + if ( ! bt->IsSet() ) { Val* val = tv->Lookup(key); sz = SingleTypeKeySize(val->Type(), val, type_check, sz, false, calc_static_size); - if ( ! sz ) return 0; + if ( ! sz ) + { + Unref(lv); + return 0; + } } } + Unref(lv); + break; }