You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by fg...@apache.org on 2022/03/08 13:54:14 UTC
[nifi-minifi-cpp] 04/05: MINIFICPP-1766 ProcessSession::read can't read zero length flowfiles (DatabaseContentRepository)
This is an automated email from the ASF dual-hosted git repository.
fgerlits pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit 0f50a5ab7cd9bcb2239099ebbd30d617ee54ac33
Author: Martin Zink <ma...@apache.org>
AuthorDate: Thu Feb 10 18:15:05 2022 +0100
MINIFICPP-1766 ProcessSession::read can't read zero length flowfiles (DatabaseContentRepository)
Signed-off-by: Ferenc Gerlits <fg...@gmail.com>
This closes #1273
---
extensions/rocksdb-repos/RocksDbStream.cpp | 3 +--
libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp | 8 ++++++--
libminifi/test/unit/ContentRepositoryDependentTests.h | 13 +++++++++++++
libminifi/test/unit/ProcessSessionTests.cpp | 5 +++++
4 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/extensions/rocksdb-repos/RocksDbStream.cpp b/extensions/rocksdb-repos/RocksDbStream.cpp
index a1d67b9..fdfe7e0 100644
--- a/extensions/rocksdb-repos/RocksDbStream.cpp
+++ b/extensions/rocksdb-repos/RocksDbStream.cpp
@@ -56,8 +56,7 @@ size_t RocksDbStream::tell() const {
size_t RocksDbStream::write(const uint8_t *value, size_t size) {
if (!write_enable_) return STREAM_ERROR;
- if (size == 0) return 0;
- if (IsNullOrEmpty(value)) return STREAM_ERROR;
+ if (size != 0 && IsNullOrEmpty(value)) return STREAM_ERROR;
auto opendb = db_->open();
if (!opendb) {
return STREAM_ERROR;
diff --git a/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp b/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
index e7f8d04..c74006f 100644
--- a/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
+++ b/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
@@ -228,13 +228,17 @@ TEST_CASE("Delete Remove Count Claim", "[TestDBCR5]") {
REQUIRE(readstr == "well hello there");
}
-TEST_CASE("ProcessSession::read reads the flowfile from offset to size", "[readoffsetsize]") {
+TEST_CASE("ProcessSession::read reads the flowfile from offset to size (RocksDB)", "[readoffsetsize]") {
ContentRepositoryDependentTests::testReadOnSmallerClonedFlowFiles(std::make_shared<core::repository::DatabaseContentRepository>());
}
-TEST_CASE("ProcessSession::append should append to the flowfile and set its size correctly" "[appendsetsize]") {
+TEST_CASE("ProcessSession::append should append to the flowfile and set its size correctly (RocksDB)" "[appendsetsize]") {
ContentRepositoryDependentTests::testAppendToUnmanagedFlowFile(std::make_shared<core::repository::DatabaseContentRepository>());
ContentRepositoryDependentTests::testAppendToManagedFlowFile(std::make_shared<core::repository::DatabaseContentRepository>());
}
+
+TEST_CASE("ProcessSession::read can read zero length flowfiles without crash (RocksDB)", "[zerolengthread]") {
+ ContentRepositoryDependentTests::testReadFromZeroLengthFlowFile(std::make_shared<core::repository::DatabaseContentRepository>());
+}
diff --git a/libminifi/test/unit/ContentRepositoryDependentTests.h b/libminifi/test/unit/ContentRepositoryDependentTests.h
index cb4a940..49c735e 100644
--- a/libminifi/test/unit/ContentRepositoryDependentTests.h
+++ b/libminifi/test/unit/ContentRepositoryDependentTests.h
@@ -177,4 +177,17 @@ void testAppendToManagedFlowFile(std::shared_ptr<core::ContentRepository> conten
CHECK(to_string(read_result) == "myfoobar");
CHECK(read_until_it_can_callback.value_ == "myfoobar");
}
+
+void testReadFromZeroLengthFlowFile(std::shared_ptr<core::ContentRepository> content_repo) {
+ Fixture fixture = Fixture(content_repo);
+ core::ProcessSession& process_session = fixture.processSession();
+ const auto flow_file = process_session.create();
+ REQUIRE(flow_file);
+ fixture.transferAndCommit(flow_file);
+
+ CHECK(flow_file->getSize() == 0);
+ REQUIRE_NOTHROW(process_session.readBuffer(flow_file));
+ ReadUntilItCan read_until_it_can_callback;
+ REQUIRE_NOTHROW(process_session.read(flow_file, &read_until_it_can_callback));
+}
} // namespace ContentRepositoryDependentTests
diff --git a/libminifi/test/unit/ProcessSessionTests.cpp b/libminifi/test/unit/ProcessSessionTests.cpp
index 088be74..3cc9a24 100644
--- a/libminifi/test/unit/ProcessSessionTests.cpp
+++ b/libminifi/test/unit/ProcessSessionTests.cpp
@@ -110,3 +110,8 @@ TEST_CASE("ProcessSession::append should append to the flowfile and set its size
ContentRepositoryDependentTests::testAppendToManagedFlowFile(std::make_shared<minifi::core::repository::VolatileContentRepository>());
ContentRepositoryDependentTests::testAppendToManagedFlowFile(std::make_shared<minifi::core::repository::FileSystemRepository>());
}
+
+TEST_CASE("ProcessSession::read can read zero length flowfiles without crash", "[zerolengthread]") {
+ ContentRepositoryDependentTests::testReadFromZeroLengthFlowFile(std::make_shared<core::repository::VolatileContentRepository>());
+ ContentRepositoryDependentTests::testReadFromZeroLengthFlowFile(std::make_shared<core::repository::FileSystemRepository>());
+}