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;
}