From 951d3a96a3e138544bf15f1552dcecd88d20accd Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Wed, 23 Jun 2021 13:44:02 +0200
Subject: [PATCH] fix memleak

---
 consumer/api/cpp/src/consumer_c_glue.cpp             | 11 ++++++-----
 tests/automatic/consumer/consumer_api/consumer_api.c |  6 +++---
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/consumer/api/cpp/src/consumer_c_glue.cpp b/consumer/api/cpp/src/consumer_c_glue.cpp
index 9aede5da0..25278ff0b 100644
--- a/consumer/api/cpp/src/consumer_c_glue.cpp
+++ b/consumer/api/cpp/src/consumer_c_glue.cpp
@@ -107,8 +107,9 @@ constexpr bool operator==(unsigned lhs, t rhs) {
     return lhs == static_cast<typename std::underlying_type<t>::type>(rhs);
 }
 
-int process_error(AsapoErrorHandle* error, asapo::Error err) {
-    int retval = (err == nullptr) ? 0 : 1;
+int process_error(AsapoErrorHandle* error, asapo::Error err,
+                  const asapo::ErrorTemplateInterface* p_exclude_err_template = nullptr) {
+    int retval = (err == nullptr || (p_exclude_err_template != nullptr && err == *p_exclude_err_template)) ? 0 : -1;
     if (error == nullptr) {
         return retval;
     }
@@ -479,7 +480,7 @@ extern "C" {
             AsapoErrorHandle* error) {
         asapo::Error err;
         auto retval = new asapo::DataSet(consumer->handle->GetNextDataset(*group_id->handle, min_size, stream, &err));
-        if (process_error(error, std::move(err)) < 0 && err != asapo::ConsumerErrorTemplates::kPartialData) {
+        if (process_error(error, std::move(err), &asapo::ConsumerErrorTemplates::kPartialData) < 0) {
             return nullptr;
         }
         return new AsapoHandlerHolder<asapo::DataSet> {retval};
@@ -495,7 +496,7 @@ extern "C" {
             AsapoErrorHandle* error) {
         asapo::Error err;
         auto retval = new asapo::DataSet(consumer->handle->GetLastDataset(min_size, stream, &err));
-        if (process_error(error, std::move(err)) < 0 && err != asapo::ConsumerErrorTemplates::kPartialData) {
+        if (process_error(error, std::move(err), &asapo::ConsumerErrorTemplates::kPartialData) < 0) {
             return nullptr;
         }
         return new AsapoHandlerHolder<asapo::DataSet> {retval};
@@ -528,7 +529,7 @@ extern "C" {
             AsapoErrorHandle* error) {
         asapo::Error err;
         auto retval = new asapo::DataSet(consumer->handle->GetDatasetById(id, min_size, stream, &err));
-        if (process_error(error, std::move(err)) < 0 && err != asapo::ConsumerErrorTemplates::kPartialData) {
+        if (process_error(error, std::move(err), &asapo::ConsumerErrorTemplates::kPartialData) < 0) {
             return nullptr;
         }
         return new AsapoHandlerHolder<asapo::DataSet> {retval};
diff --git a/tests/automatic/consumer/consumer_api/consumer_api.c b/tests/automatic/consumer/consumer_api/consumer_api.c
index 381121b42..8bac3bdda 100644
--- a/tests/automatic/consumer/consumer_api/consumer_api.c
+++ b/tests/automatic/consumer/consumer_api/consumer_api.c
@@ -170,7 +170,7 @@ void test_single(AsapoConsumerHandle consumer, AsapoStringHandle group_id) {
     ASSERT_TRUE(!strcmp(asapo_message_meta_get_name(md),"1"), "get next asapo_consumer_reset_last_read_marker ");
 
 // stream size
-    uint64_t size = asapo_consumer_get_current_size(consumer,"default", &err);
+    int64_t size = asapo_consumer_get_current_size(consumer,"default", &err);
     EXIT_IF_ERROR("asapo_consumer_get_current_size", err);
     ASSERT_EQ_INT(10,size,"asapo_consumer_get_current_size");
 
@@ -211,9 +211,9 @@ void test_single(AsapoConsumerHandle consumer, AsapoStringHandle group_id) {
     asapo_free_handle(&s2);
 
 // acknowledges
-    uint64_t id = asapo_consumer_get_last_acknowledged_message(consumer,group_id, "default", &err);
+    int64_t id = asapo_consumer_get_last_acknowledged_message(consumer,group_id, "default", &err);
     ASSERT_TRUE(asapo_error_get_type(err) == kNoData,"last ack default stream no data");
-    ASSERT_EQ_INT(0,id,"last ack default stream no data id = 0");
+    ASSERT_EQ_INT(-1,id,"last ack default stream no data id = -1");
 
     AsapoIdListHandle nacks = asapo_consumer_get_unacknowledged_messages(consumer, group_id, 0, 0, "default", &err);
     EXIT_IF_ERROR("asapo_consumer_get_unacknowledged_messages", err);
-- 
GitLab