You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ab...@apache.org on 2020/05/14 07:49:55 UTC

[nifi-minifi-cpp] branch master updated: MINIFICPP-1220 fix memleak and clarify ownership semantics in CWEL

This is an automated email from the ASF dual-hosted git repository.

aboda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git


The following commit(s) were added to refs/heads/master by this push:
     new aadb6e6  MINIFICPP-1220 fix memleak and clarify ownership semantics in CWEL
aadb6e6 is described below

commit aadb6e67685e45966feb34a03dd6ac4a22dde250
Author: Szasz Marton <sz...@gmail.com>
AuthorDate: Tue May 12 19:41:35 2020 +0200

    MINIFICPP-1220 fix memleak and clarify ownership semantics in CWEL
    
    Signed-off-by: Arpad Boda <ab...@apache.org>
    
    This closes #780
---
 extensions/windows-event-log/Bookmark.cpp          | 55 ++++++++++------------
 extensions/windows-event-log/Bookmark.h            | 13 +++--
 .../windows-event-log/ConsumeWindowsEventLog.cpp   |  7 ++-
 3 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/extensions/windows-event-log/Bookmark.cpp b/extensions/windows-event-log/Bookmark.cpp
index 1bbcfe9..995449e 100644
--- a/extensions/windows-event-log/Bookmark.cpp
+++ b/extensions/windows-event-log/Bookmark.cpp
@@ -38,7 +38,7 @@ Bookmark::Bookmark(const std::wstring& channel, const std::wstring& query, const
   }
 
   if (!bookmarkXml_.empty()) {
-    if (hBookmark_ = EvtCreateBookmark(bookmarkXml_.c_str())) {
+    if (hBookmark_ = unique_evt_handle{ EvtCreateBookmark(bookmarkXml_.c_str()) }) {
       ok_ = true;
       return;
     }
@@ -50,56 +50,51 @@ Bookmark::Bookmark(const std::wstring& channel, const std::wstring& query, const
     state_manager_->set(state_map);
   }
 
-  if (!(hBookmark_ = EvtCreateBookmark(0))) {
+  if (!(hBookmark_ = unique_evt_handle{ EvtCreateBookmark(0) })) {
     LOG_LAST_ERROR(EvtCreateBookmark);
     return;
   }
 
-  const auto hEventResults = EvtQuery(0, channel.c_str(), query.c_str(), EvtQueryChannelPath);
+  const auto hEventResults = unique_evt_handle{ EvtQuery(0, channel.c_str(), query.c_str(), EvtQueryChannelPath) };
   if (!hEventResults) {
     LOG_LAST_ERROR(EvtQuery);
     return;
   }
-  const utils::ScopeGuard guard_hEventResults([hEventResults]() { EvtClose(hEventResults); });
 
-  if (!EvtSeek(hEventResults, 0, 0, 0, processOldEvents? EvtSeekRelativeToFirst : EvtSeekRelativeToLast)) {
+  if (!EvtSeek(hEventResults.get(), 0, 0, 0, processOldEvents? EvtSeekRelativeToFirst : EvtSeekRelativeToLast)) {
     LOG_LAST_ERROR(EvtSeek);
     return;
   }
 
-  DWORD dwReturned{};
-  EVT_HANDLE hEvent{};
-  if (!EvtNext(hEventResults, 1, &hEvent, INFINITE, 0, &dwReturned)) {
-    LOG_LAST_ERROR(EvtNext);
-    return;
-  }
+  const unique_evt_handle hEvent = [this,&hEventResults] {
+    DWORD dwReturned{};
+    EVT_HANDLE hEvent{ nullptr };
+    if (!EvtNext(hEventResults.get(), 1, &hEvent, INFINITE, 0, &dwReturned)) {
+      LOG_LAST_ERROR(EvtNext);
+    }
+    return unique_evt_handle{ hEvent };
+  }();
 
-  ok_ = saveBookmark(hEvent);
+  ok_ = hEvent && saveBookmark(hEvent.get());
 }
 
-Bookmark::~Bookmark() {
-  if (hBookmark_) {
-    EvtClose(hBookmark_);
-  }
-}
+Bookmark::~Bookmark() = default;
 
-Bookmark::operator bool() const {
+Bookmark::operator bool() const noexcept {
   return ok_;
 }
+
+void Bookmark::evt_deleter::operator()(EVT_HANDLE evt) const noexcept {
+  EvtClose(evt);
+}
   
 EVT_HANDLE Bookmark::getBookmarkHandleFromXML() {
-  if (hBookmark_) {
-    EvtClose(hBookmark_);
-    hBookmark_ = 0;
-  }
-
-  hBookmark_ = EvtCreateBookmark(bookmarkXml_.c_str());
-  if (!(hBookmark_ = EvtCreateBookmark(bookmarkXml_.c_str()))) {
+  hBookmark_ = unique_evt_handle{ EvtCreateBookmark(bookmarkXml_.c_str()) };
+  if (!hBookmark_) {
     LOG_LAST_ERROR(EvtCreateBookmark);
-    return 0;
   }
 
-  return hBookmark_;
+  return hBookmark_.get();
 }
 
 bool Bookmark::saveBookmarkXml(const std::wstring& bookmarkXml) {
@@ -122,7 +117,7 @@ bool Bookmark::saveBookmark(EVT_HANDLE hEvent)
 }
 
 bool Bookmark::getNewBookmarkXml(EVT_HANDLE hEvent, std::wstring& bookmarkXml) {
-  if (!EvtUpdateBookmark(hBookmark_, hEvent)) {
+  if (!EvtUpdateBookmark(hBookmark_.get(), hEvent)) {
     LOG_LAST_ERROR(EvtUpdateBookmark);
     return false;
   }
@@ -131,14 +126,14 @@ bool Bookmark::getNewBookmarkXml(EVT_HANDLE hEvent, std::wstring& bookmarkXml) {
   DWORD bufferSize{};
   DWORD bufferUsed{};
   DWORD propertyCount{};
-  if (!EvtRender(0, hBookmark_, EvtRenderBookmark, bufferSize, 0, &bufferUsed, &propertyCount)) {
+  if (!EvtRender(nullptr, hBookmark_.get(), EvtRenderBookmark, bufferSize, nullptr, &bufferUsed, &propertyCount)) {
     DWORD status = ERROR_SUCCESS;
     if (ERROR_INSUFFICIENT_BUFFER == (status = GetLastError())) {
       bufferSize = bufferUsed;
 
       std::vector<wchar_t> buf(bufferSize / 2 + 1);
 
-      if (!EvtRender(0, hBookmark_, EvtRenderBookmark, bufferSize, &buf[0], &bufferUsed, &propertyCount)) {
+      if (!EvtRender(nullptr, hBookmark_.get(), EvtRenderBookmark, bufferSize, &buf[0], &bufferUsed, &propertyCount)) {
         LOG_LAST_ERROR(EvtRender);
         return false;
       }
diff --git a/extensions/windows-event-log/Bookmark.h b/extensions/windows-event-log/Bookmark.h
index 4d40064..119437f 100644
--- a/extensions/windows-event-log/Bookmark.h
+++ b/extensions/windows-event-log/Bookmark.h
@@ -4,6 +4,7 @@
 #include <memory>
 #include <windows.h>
 #include <winevt.h>
+#include <type_traits>
 
 #include "core/ProcessContext.h"
 #include "core/ProcessSession.h"
@@ -21,20 +22,26 @@ class Bookmark
 public:
   Bookmark(const std::wstring& channel, const std::wstring& query, const std::string& bookmarkRootDir, const std::string& uuid, bool processOldEvents, std::shared_ptr<core::CoreComponentStateManager> state_manager, std::shared_ptr<logging::Logger> logger);
   ~Bookmark();
-  operator bool() const;
-  EVT_HANDLE getBookmarkHandleFromXML();
+  explicit operator bool() const noexcept;
+
+  /* non-owning */ EVT_HANDLE getBookmarkHandleFromXML();
   bool getNewBookmarkXml(EVT_HANDLE hEvent, std::wstring& bookmarkXml);
   bool saveBookmarkXml(const std::wstring& bookmarkXml);
 private:
   bool saveBookmark(EVT_HANDLE hEvent);
   bool getBookmarkXmlFromFile(std::wstring& bookmarkXml);
 
+  struct evt_deleter {
+    void operator()(EVT_HANDLE) const noexcept;
+  };
+  using unique_evt_handle = std::unique_ptr<std::remove_pointer<EVT_HANDLE>::type, evt_deleter>;
+
 private:
   std::shared_ptr<logging::Logger> logger_;
   std::shared_ptr<core::CoreComponentStateManager> state_manager_;
   std::string filePath_;
   bool ok_{};
-  EVT_HANDLE hBookmark_{};
+  unique_evt_handle hBookmark_;
   std::wstring bookmarkXml_;
 };
 
diff --git a/extensions/windows-event-log/ConsumeWindowsEventLog.cpp b/extensions/windows-event-log/ConsumeWindowsEventLog.cpp
index 85686c0..0a4bbbd 100644
--- a/extensions/windows-event-log/ConsumeWindowsEventLog.cpp
+++ b/extensions/windows-event-log/ConsumeWindowsEventLog.cpp
@@ -306,7 +306,10 @@ void ConsumeWindowsEventLog::onTrigger(const std::shared_ptr<core::ProcessContex
     session->commit();
     logger_->log_debug("processQueue commit took %" PRId64 " ms", timeDiff());
 
-    pBookmark_->saveBookmarkXml(bookmarkXml);
+    const bool successful_save = pBookmark_->saveBookmarkXml(bookmarkXml);
+    if (!successful_save) {
+      logger_->log_error("Failed to save bookmark xml");
+    }
 
     if (session->outgoingConnectionsFull("success")) {
       logger_->log_debug("outgoingConnectionsFull");
@@ -334,7 +337,7 @@ void ConsumeWindowsEventLog::onTrigger(const std::shared_ptr<core::ProcessContex
 
   auto hBookmark = pBookmark_->getBookmarkHandleFromXML();
   if (!hBookmark) {
-    // Unrecovarable error.
+    // Unrecoverable error.
     pBookmark_.reset();
     return;
   }