From 9fbc9b02b2b81b4d5813decea672b13f8553e424 Mon Sep 17 00:00:00 2001 From: stellarbears Date: Tue, 19 Feb 2019 13:12:37 +0300 Subject: [PATCH] 1.3.1. fix possible memory leak isuues --- YaraSharp/Compiler.cpp | 4 +++- YaraSharp/Compiler.h | 1 + YaraSharp/Instance.cpp | 42 +++++++++++++++++++++++++++++------------ YaraSharp/Scanner.cpp | 8 +++++--- YaraSharp/Scanner.h | 1 + YaraSharp/YaraSharp.rc | Bin 5280 -> 5280 bytes nuget/YaraSharp.nuspec | 2 +- 7 files changed, 41 insertions(+), 17 deletions(-) diff --git a/YaraSharp/Compiler.cpp b/YaraSharp/Compiler.cpp index e53d0e1..c730e45 100644 --- a/YaraSharp/Compiler.cpp +++ b/YaraSharp/Compiler.cpp @@ -26,6 +26,8 @@ namespace YaraSharp yr_compiler_destroy(compiler); } + callbackHandle.Free(); + delete warnings; delete errors; } @@ -134,7 +136,7 @@ namespace YaraSharp void YSCompiler::SetCompilerCallback() { YaraCompilerCallback^ compilerCallback = gcnew YaraCompilerCallback(this, &YSCompiler::HandleCompilerCallback); - GCHandle callbackHandle = GCHandle::Alloc(compilerCallback); + callbackHandle = GCHandle::Alloc(compilerCallback); YR_COMPILER_CALLBACK_FUNC callbackPointer = (YR_COMPILER_CALLBACK_FUNC)(Marshal::GetFunctionPointerForDelegate(compilerCallback)).ToPointer(); yr_compiler_set_callback(compiler, callbackPointer, NULL); } diff --git a/YaraSharp/Compiler.h b/YaraSharp/Compiler.h index 0103b7b..9900e45 100644 --- a/YaraSharp/Compiler.h +++ b/YaraSharp/Compiler.h @@ -10,6 +10,7 @@ namespace YaraSharp YSReport^ errors; YSReport^ warnings; initonly YR_COMPILER* compiler; + GCHandle callbackHandle; public: YSCompiler(Dictionary^ externalVariables); diff --git a/YaraSharp/Instance.cpp b/YaraSharp/Instance.cpp index 1ebe2d5..7b8343e 100644 --- a/YaraSharp/Instance.cpp +++ b/YaraSharp/Instance.cpp @@ -19,30 +19,48 @@ namespace YaraSharp { YSScanner^ FScanner = gcnew YSScanner(rules, externalVariables); - List^ results = FScanner->ScanFile(path); - delete FScanner; - - return results; + try { + List^ results = FScanner->ScanFile(path); + return results; + } + catch (System::Exception^ e) { + throw e; + } + finally{ + delete FScanner; + } } // (not yet tested) List^ YSInstance::ScanProcess(int pID, YSRules^ rules, Dictionary^ externalVariables, int timeout) { YSScanner^ PScanner = gcnew YSScanner(rules, externalVariables); - List^ results = PScanner->ScanProcess(pID); - delete PScanner; - - return results; + try { + List^ results = PScanner->ScanProcess(pID); + return results; + } + catch (System::Exception^ e) { + throw e; + } + finally{ + delete PScanner; + } } // (not yet tested) List^ YSInstance::ScanMemory(uint8_t* buffer, int length, YSRules^ rules, Dictionary^ externalVariables, int timeout) { YSScanner^ MScanner = gcnew YSScanner(rules, externalVariables); - List^ results = MScanner->ScanMemory(buffer, length); - delete MScanner; - - return results; + try { + List^ results = MScanner->ScanMemory(buffer, length); + return results; + } + catch (System::Exception^ e) { + throw e; + } + finally{ + delete MScanner; + } } // (not yet tested) List^ YSInstance::ScanMemory(array^ buffer, YSRules^ rules, Dictionary^ externalVariables, int timeout) diff --git a/YaraSharp/Scanner.cpp b/YaraSharp/Scanner.cpp index 08f9ad2..2422eff 100644 --- a/YaraSharp/Scanner.cpp +++ b/YaraSharp/Scanner.cpp @@ -23,6 +23,8 @@ namespace YaraSharp { yr_scanner_destroy(scanner); } + + callbackHandle.Free(); } // Scan region @@ -78,9 +80,9 @@ namespace YaraSharp // Callback void YSScanner::SetScannerCallback() { - YaraScanCallback^ ScannerCallback = gcnew YaraScanCallback(this, &YSScanner::HandleScannerCallback); - GCHandle CallbackHandle = GCHandle::Alloc(ScannerCallback); - YR_CALLBACK_FUNC CallbackPointer = (YR_CALLBACK_FUNC)Marshal::GetFunctionPointerForDelegate(ScannerCallback).ToPointer(); + YaraScanCallback^ scannerCallback = gcnew YaraScanCallback(this, &YSScanner::HandleScannerCallback); + callbackHandle = GCHandle::Alloc(scannerCallback); + YR_CALLBACK_FUNC CallbackPointer = (YR_CALLBACK_FUNC)Marshal::GetFunctionPointerForDelegate(scannerCallback).ToPointer(); yr_scanner_set_callback(scanner, CallbackPointer, NULL); } int YSScanner::HandleScannerCallback(int message, void* data, void* context) diff --git a/YaraSharp/Scanner.h b/YaraSharp/Scanner.h index 1f4557b..829e0ca 100644 --- a/YaraSharp/Scanner.h +++ b/YaraSharp/Scanner.h @@ -9,6 +9,7 @@ namespace YaraSharp { initonly YR_SCANNER * scanner; List^ matches; + GCHandle callbackHandle; public: YSScanner(YSRules^ rules, Dictionary^ externalVariables); diff --git a/YaraSharp/YaraSharp.rc b/YaraSharp/YaraSharp.rc index ceecc644f12d784efd5611b94d2bbd8dc4290044..25a9549758061a4966b4b71817c6b2b07a8812cb 100644 GIT binary patch delta 38 rcmZ3Wxj=J+4mYFWWL<7UM#IhV+`P;{DwmIy2`HA!C%w5(K!^nZz@G^) delta 38 rcmZ3Wxj=J+4mYF0WL<7UMuW}q+`P;{DwmIy2`HA!C%w5(K!^nZz)lG) diff --git a/nuget/YaraSharp.nuspec b/nuget/YaraSharp.nuspec index 5e7116e..0f72fff 100644 --- a/nuget/YaraSharp.nuspec +++ b/nuget/YaraSharp.nuspec @@ -2,7 +2,7 @@ YaraSharp - 1.3.0 + 1.3.1 YaraSharp stellarbears stellarbears