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

pengzheng pushed a commit to branch feature/error_injector
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to refs/heads/feature/error_injector by this 
push:
     new 94bab53f Fix memory over-read and leak in PSA#465
94bab53f is described below

commit 94bab53f5ea913b76027226ae6669bc02989e4eb
Author: PengZheng <[email protected]>
AuthorDate: Tue Jan 17 21:56:23 2023 +0800

    Fix memory over-read and leak in PSA#465
    
    It fixed several other bugs revealed by this fix:
    
    * memory leak in zmq receiver
    * endianness bugs
    * uninitialised `message.header.convertEndianess` in zmq sender
    
    It also serves as an examples of utilizing error injector to achieve high 
line/branch coverage.
---
 .../src/pubsub_zmq_topic_receiver.c                |   5 +
 .../pubsub_admin_zmq/src/pubsub_zmq_topic_sender.c |   2 +-
 .../pubsub_protocol_lib/gtest/CMakeLists.txt       |   2 +-
 .../gtest/src/PS_WP_common_tests.cc                | 144 ++++++++++++++++++++-
 .../src/pubsub_wire_protocol_common.c              |  67 ++++++----
 .../gtest/src/PS_WP_tests.cc                       |   6 +-
 .../src/pubsub_wire_protocol_impl.c                |  11 +-
 misc/error_injector/CMakeLists.txt                 |   3 +-
 .../{malloc => celix_properties}/CMakeLists.txt    |   8 +-
 .../celix_properties_ei.cpp}                       |  21 ++-
 .../celix_properties_ei.h}                         |  10 +-
 misc/error_injector/malloc/CMakeLists.txt          |   2 +-
 misc/error_injector/malloc/malloc_ei.cpp           |   7 +
 misc/error_injector/malloc/malloc_ei.h             |   1 +
 14 files changed, 233 insertions(+), 56 deletions(-)

diff --git a/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_receiver.c 
b/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_receiver.c
index 90d93cb4..31f3a780 100644
--- a/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_receiver.c
+++ b/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_receiver.c
@@ -468,6 +468,7 @@ static inline void processMsg(pubsub_zmq_topic_receiver_t 
*receiver, pubsub_prot
                                                                      
&deSerializeBuffer, 0, &deserializedMsg);
         if (status == CELIX_SUCCESS) {
             celix_properties_t *metadata = message->metadata.metadata;
+            bool metadataWasNull = metadata == NULL;
             bool cont = 
pubsubInterceptorHandler_invokePreReceive(receiver->interceptorsHandler, 
msgFqn, message->header.msgId, deserializedMsg, &metadata);
             bool release = true;
             if (cont) {
@@ -479,6 +480,10 @@ static inline void processMsg(pubsub_zmq_topic_receiver_t 
*receiver, pubsub_prot
             if (release) {
                 
pubsub_serializerHandler_freeDeserializedMsg(receiver->serializerHandler, 
message->header.msgId, deserializedMsg);
             }
+            if (metadataWasNull) {
+                //note that if the metadata was created by the 
pubsubInterceptorHandler_invokePreReceive, this needs to be deallocated
+                celix_properties_destroy(metadata);
+            }
         } else {
             L_WARN("[PSA_ZMQ_TR] Cannot deserialize msg type %s for 
scope/topic %s/%s", msgFqn,
                    receiver->scope == NULL ? "(null)" : receiver->scope, 
receiver->topic);
diff --git a/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_sender.c 
b/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_sender.c
index 3fb68f56..9db9baa2 100644
--- a/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_sender.c
+++ b/bundles/pubsub/pubsub_admin_zmq/src/pubsub_zmq_topic_sender.c
@@ -433,6 +433,7 @@ static int psa_zmq_topicPublicationSend(void* handle, 
unsigned int msgTypeId, co
     pubsub_protocol_message_t message;
     message.payload.payload = serializedIoVecOutput->iov_base;
     message.payload.length = serializedIoVecOutput->iov_len;
+    message.header.convertEndianess = 0;
 
     void *payloadData = NULL;
     size_t payloadLength = 0;
@@ -457,7 +458,6 @@ static int psa_zmq_topicPublicationSend(void* handle, 
unsigned int msgTypeId, co
     message.header.payloadPartSize = payloadLength;
     message.header.payloadOffset = 0;
     message.header.isLastSegment = 1;
-    message.header.convertEndianess = 0;
 
     sender->protocol->encodeHeader(sender->protocol->handle, &message, 
&sender->zmqBuffers.headerBuffer, &sender->zmqBuffers.headerBufferSize);
 
diff --git 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/CMakeLists.txt 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/CMakeLists.txt
index bba51785..47f99620 100644
--- a/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/CMakeLists.txt
@@ -17,7 +17,7 @@
 
 add_executable(celix_pswp_common_tests src/PS_WP_common_tests.cc)
 target_include_directories(celix_pswp_common_tests PRIVATE 
${CMAKE_CURRENT_SOURCE_DIR}/../src)
-target_link_libraries(celix_pswp_common_tests PRIVATE 
celix_pubsub_protocol_lib GTest::gtest Celix::pubsub_spi GTest::gtest_main 
malloc_ei)
+target_link_libraries(celix_pswp_common_tests PRIVATE 
celix_pubsub_protocol_lib GTest::gtest Celix::pubsub_spi GTest::gtest_main 
malloc_ei celix_properties_ei)
 
 add_test(NAME celix_pswp_common_tests COMMAND celix_pswp_common_tests)
 setup_target_for_coverage(celix_pswp_common_tests SCAN_DIR ..)
\ No newline at end of file
diff --git 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/src/PS_WP_common_tests.cc
 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/src/PS_WP_common_tests.cc
index 25a90210..93ecabed 100644
--- 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/src/PS_WP_common_tests.cc
+++ 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/gtest/src/PS_WP_common_tests.cc
@@ -22,6 +22,7 @@
 #include <gtest/gtest.h>
 #include <iostream>
 #include <cstring>
+#include <celix_properties_ei.h>
 #include <malloc_ei.h>
 
 #include "pubsub_wire_protocol_common.h"
@@ -30,7 +31,9 @@ class WireProtocolCommonTest : public ::testing::Test {
 public:
     WireProtocolCommonTest() = default;
     ~WireProtocolCommonTest() override {
-        celix_ei_expect_realloc(nullptr, 0, NULL);
+        celix_ei_expect_realloc(nullptr, 0, nullptr);
+        celix_ei_expect_calloc(nullptr, 0, nullptr);
+        celix_ei_expect_celix_properties_create(nullptr, 0, nullptr);
     };
 };
 
@@ -244,3 +247,142 @@ TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_DencodeMetadataWithMultipl
     celix_properties_destroy(message.metadata.metadata);
 }
 
+TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_DencodeMetadataWithExtraEntries) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 1;
+    message.metadata.metadata = nullptr;
+
+    char* data = 
strdup("ABCD4:key1,6:value1,4:key2,6:value2,6:key111,8:value111,"); //note 3 
entries
+    auto len = strlen(data);
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 2);
+    auto status = pubsubProtocol_decodeMetadata((void*)data, len, &message);
+    // the 3rd entry should be ignored
+    EXPECT_EQ(status, CELIX_SUCCESS);
+    EXPECT_EQ(2, celix_properties_size(message.metadata.metadata));
+    EXPECT_STREQ("value1", celix_properties_get(message.metadata.metadata, 
"key1", "not-found"));
+    EXPECT_STREQ("value2", celix_properties_get(message.metadata.metadata, 
"key2", "not-found"));
+    EXPECT_STREQ("not-found", celix_properties_get(message.metadata.metadata, 
"key111", "not-found"));
+
+    free(data);
+    celix_properties_destroy(message.metadata.metadata);
+}
+
+TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_DencodeMetadataMissingEntries) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 1;
+    message.metadata.metadata = nullptr;
+
+    char* data = 
strdup("ABCD4:key1,6:value1,4:key2,6:value2,6:key111,8:value111,"); //note 3 
entries
+    auto len = strlen(data);
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 4);
+    auto status = pubsubProtocol_decodeMetadata((void*)data, len, &message);
+
+    EXPECT_EQ(status, CELIX_INVALID_SYNTAX);
+    EXPECT_EQ(nullptr, message.metadata.metadata);
+
+    free(data);
+}
+
+TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_DecodeMetadataWithSingleEntryWithIncompleteValue) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 0;
+    message.metadata.metadata = nullptr;
+
+    char* data = strdup("ABCD4:key1,6:val,"); //note 1 entry with short value
+    auto len = strlen(data);
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 1);
+    auto status = pubsubProtocol_decodeMetadata((void*)data, len, &message);
+
+    EXPECT_EQ(status, CELIX_INVALID_SYNTAX);
+    EXPECT_EQ(nullptr, message.metadata.metadata);
+
+    free(data);
+}
+
+TEST_F(WireProtocolCommonTest, WireProtocolCommonTest_DecodeMetadataTooShort) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 0;
+    message.metadata.metadata = nullptr;
+
+    char* data = strdup("ABCD4:key1,6:value1,"); //note 1 entry
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 1);
+    auto status = pubsubProtocol_decodeMetadata((void*)data, 3, &message); // 
not enough data for `nOfElements`
+
+    EXPECT_EQ(status, CELIX_INVALID_SYNTAX);
+    EXPECT_EQ(nullptr, message.metadata.metadata);
+
+    free(data);
+}
+
+TEST_F(WireProtocolCommonTest, WireProtocolCommonTest_DecodeEmptyMetadata) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 0;
+    message.metadata.metadata = nullptr;
+
+    uint32_t data = 0;
+    auto status = pubsubProtocol_decodeMetadata((void*)&data, 4, &message);
+
+    EXPECT_EQ(status, CELIX_SUCCESS);
+    EXPECT_EQ(nullptr, message.metadata.metadata);
+
+    // incorrect `nOfElements`
+    data = 4;
+    status = pubsubProtocol_decodeMetadata((void*)&data, 4, &message);
+
+    EXPECT_EQ(status, CELIX_INVALID_SYNTAX);
+    EXPECT_EQ(nullptr, message.metadata.metadata);
+}
+
+TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_NotEnoughMemoryForMultipleEntries) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 1;
+    message.metadata.metadata = nullptr;
+
+    char* data = 
strdup("ABCD4:key1,6:value1,4:key2,6:value2,6:key111,8:value111,"); //note 3 
entries
+    auto len = strlen(data);
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 3);
+    for (int i = 0; i < 6; ++i) {
+        celix_ei_expect_calloc((void *)pubsubProtocol_decodeMetadata, 0, 
nullptr, i+1);
+        auto status = pubsubProtocol_decodeMetadata((void*)data, len, 
&message);
+
+        EXPECT_EQ(status, CELIX_ENOMEM);
+        EXPECT_EQ(nullptr, message.metadata.metadata);
+    }
+    free(data);
+}
+
+TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_PropertiesAllocFailureWhenDecodingMetadata) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 0;
+    message.metadata.metadata = nullptr;
+
+    char* data = strdup("ABCD4:key1,6:value1,"); //note 1 entry
+    auto len = strlen(data);
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 1);
+    
celix_ei_expect_celix_properties_create((void*)pubsubProtocol_decodeMetadata, 
0, nullptr);
+    auto status = pubsubProtocol_decodeMetadata((void*)data, len, &message);
+
+    EXPECT_EQ(status, CELIX_ENOMEM);
+    EXPECT_EQ(nullptr, message.metadata.metadata);
+
+    free(data);
+}
+
+TEST_F(WireProtocolCommonTest, 
WireProtocolCommonTest_DencodeMetadataWithDuplicateEntries) {
+    pubsub_protocol_message_t message;
+    message.header.convertEndianess = 1;
+    message.metadata.metadata = nullptr;
+
+    char* data = 
strdup("ABCD4:key1,6:value1,4:key1,6:value2,6:key111,8:value111,"); //note 3 
entries with duplicate key1
+    auto len = strlen(data);
+    pubsubProtocol_writeInt((unsigned char*)data, 0, 
message.header.convertEndianess, 3);
+    auto status = pubsubProtocol_decodeMetadata((void*)data, len, &message);
+
+    EXPECT_EQ(status, CELIX_SUCCESS);
+    EXPECT_EQ(2, celix_properties_size(message.metadata.metadata));
+    EXPECT_STREQ("value2", celix_properties_get(message.metadata.metadata, 
"key1", "not-found"));
+    EXPECT_STREQ("value111", celix_properties_get(message.metadata.metadata, 
"key111", "not-found"));
+
+    free(data);
+    celix_properties_destroy(message.metadata.metadata);
+}
diff --git 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/src/pubsub_wire_protocol_common.c
 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/src/pubsub_wire_protocol_common.c
index b6e883e1..7b78cea0 100644
--- 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/src/pubsub_wire_protocol_common.c
+++ 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_lib/src/pubsub_wire_protocol_common.c
@@ -261,37 +261,58 @@ celix_status_t pubsubProtocol_decodePayload(void *data, 
size_t length, pubsub_pr
 
 celix_status_t pubsubProtocol_decodeMetadata(void *data, size_t length, 
pubsub_protocol_message_t *message) {
     celix_status_t status = CELIX_SUCCESS;
-
+    message->metadata.metadata = NULL;
+    if (length < sizeof(uint32_t)) {
+        return CELIX_INVALID_SYNTAX;
+    }
     uint32_t nOfElements;
     size_t idx = pubsubProtocol_readInt(data, 0, 
message->header.convertEndianess, &nOfElements);
+    if (nOfElements  == 0) {
+        return CELIX_SUCCESS;
+    }
     unsigned char *netstring = data + idx;
-    int netstringLen = length - idx;
+    size_t netstringLen = length - idx;
 
     message->metadata.metadata = celix_properties_create();
-    while (idx < length) {
-        size_t outlen;
-        status = pubsubProtocol_parseNetstring(netstring, netstringLen, 
&netstring, &outlen);
-        if (status != CELIX_SUCCESS) {
-            break;
+    if (message->metadata.metadata == NULL) {
+        return CELIX_ENOMEM;
+    }
+    for (; nOfElements > 0 && netstringLen > 0; nOfElements--) {
+        int i;
+        char *strs[2] = {NULL, NULL};
+        for (i = 0; i < 2; ++i) {
+            unsigned char *outstring = NULL;
+            size_t outlen;
+            status = pubsubProtocol_parseNetstring(netstring, netstringLen, 
&outstring, &outlen);
+            if (status != CELIX_SUCCESS) {
+                status = CELIX_INVALID_SYNTAX;
+                break;
+            }
+            strs[i] = calloc(outlen + 1, sizeof(char));
+            if (strs[i] == NULL) {
+                status = CELIX_ENOMEM;
+                break;
+            }
+            memcpy(strs[i], outstring, outlen);
+            strs[i][outlen] = '\0';
+            netstringLen -= (outstring - netstring + outlen + 1);
+            netstring = outstring + (outlen + 1);
         }
-        char *key = calloc(outlen + 1, sizeof(char));
-        memcpy(key, netstring, outlen);
-        key[outlen] = '\0';
-        netstring += outlen + 1;
-        idx += outlen + 3;
-
-        status = pubsubProtocol_parseNetstring(netstring, netstringLen, 
&netstring, &outlen);
-        if (status != CELIX_SUCCESS) {
+        if (i == 2) {
+            // if metadata has duplicate keys, the last one takes effect
+            celix_properties_unset(message->metadata.metadata, strs[0]);
+            celix_properties_setWithoutCopy(message->metadata.metadata, 
strs[0], strs[1]);
+        } else {
+            for (int j = 0; j < i; ++j) {
+                free(strs[j]);
+            }
             break;
         }
-        char *value = calloc(outlen + 1, sizeof(char));
-        memcpy(value, netstring, outlen);
-        value[outlen] = '\0';
-        netstring += outlen + 1;
-        idx += outlen + 3;
-
-        celix_properties_setWithoutCopy(message->metadata.metadata, key, 
value);
     }
-
+    if (nOfElements > 0) {
+        celix_properties_destroy(message->metadata.metadata);
+        message->metadata.metadata = NULL;
+        status = (status != CELIX_SUCCESS) ? status : CELIX_INVALID_SYNTAX;
+    }
     return status;
 }
\ No newline at end of file
diff --git 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/gtest/src/PS_WP_tests.cc
 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/gtest/src/PS_WP_tests.cc
index 02cf89d0..346514af 100644
--- 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/gtest/src/PS_WP_tests.cc
+++ 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/gtest/src/PS_WP_tests.cc
@@ -234,7 +234,7 @@ TEST_F(WireProtocolV1Test, 
WireProtocolV1Test_DecodeMetadata_Test) { // NOLINT(c
     memcpy(exp + 4, "1:a,1:b,", 8);
 
     pubsub_protocol_message_t message;
-    message.header.convertEndianess = false;
+    message.header.convertEndianess = true;
     celix_status_t status = pubsubProtocol_v1_decodeMetadata(nullptr, exp, 12, 
&message);
 
     ASSERT_EQ(status, CELIX_SUCCESS);
@@ -257,7 +257,7 @@ TEST_F(WireProtocolV1Test, 
WireProtocolV1Test_DecodeMetadata_EmptyKey_Test) { //
     memcpy(exp + 4, "0:,1:b,", 7);
 
     pubsub_protocol_message_t message;
-    message.header.convertEndianess = false;
+    message.header.convertEndianess = true;
     celix_status_t status = pubsubProtocol_v1_decodeMetadata(nullptr, exp, 11, 
&message);
 
     ASSERT_EQ(status, CELIX_SUCCESS);
@@ -279,7 +279,7 @@ TEST_F(WireProtocolV1Test, 
WireProtocolV1Test_DecodeMetadata_SpecialChars_Test)
     memcpy(exp + 4, "4:a,:l,1:b,", 11);
 
     pubsub_protocol_message_t message;
-    message.header.convertEndianess = false;
+    message.header.convertEndianess = true;
     celix_status_t status = pubsubProtocol_v1_decodeMetadata(nullptr, &exp, 
15, &message);
 
     ASSERT_EQ(status, CELIX_SUCCESS);
diff --git 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/src/pubsub_wire_protocol_impl.c
 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/src/pubsub_wire_protocol_impl.c
index 04048a2a..03aa3466 100644
--- 
a/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/src/pubsub_wire_protocol_impl.c
+++ 
b/bundles/pubsub/pubsub_protocol/pubsub_protocol_wire_v1/src/pubsub_wire_protocol_impl.c
@@ -27,7 +27,6 @@
 #include "pubsub_wire_protocol_impl.h"
 #include "pubsub_wire_protocol_common.h"
 
-#define BYTESWAP_SYNC true
 
 struct pubsub_protocol_wire_v1 {
 };
@@ -96,7 +95,7 @@ celix_status_t pubsubProtocol_encodeHeader(void *handle, 
pubsub_protocol_message
         status = CELIX_ENOMEM;
     } else {
         int idx = 0;
-        idx = pubsubProtocol_writeInt(*outBuffer, idx,  BYTESWAP_SYNC, 
PROTOCOL_WIRE_V1_SYNC_HEADER);
+        idx = pubsubProtocol_writeInt(*outBuffer, idx,  true, 
PROTOCOL_WIRE_V1_SYNC_HEADER);
         idx = pubsubProtocol_writeInt(*outBuffer, idx,  true, 
PROTOCOL_WIRE_V1_ENVELOPE_VERSION);
         idx = pubsubProtocol_writeInt(*outBuffer, idx,  true, 
message->header.msgId);
         idx = pubsubProtocol_writeShort(*outBuffer, idx, true, 
message->header.msgMajorVersion);
@@ -111,22 +110,27 @@ celix_status_t pubsubProtocol_encodeHeader(void *handle, 
pubsub_protocol_message
 }
 
 celix_status_t pubsubProtocol_v1_encodePayload(void *handle 
__attribute__((unused)), pubsub_protocol_message_t *message, void **outBuffer, 
size_t *outLength) {
+    message->header.convertEndianess = true;
     return pubsubProtocol_encodePayload(message, outBuffer, outLength);
 }
 
 celix_status_t pubsubProtocol_v1_encodeMetadata(void *handle 
__attribute__((unused)), pubsub_protocol_message_t *message, void 
**bufferInOut, size_t *bufferLengthInOut, size_t *bufferContentLengthOut) {
+    message->header.convertEndianess = true;
     return pubsubProtocol_encodeMetadata(message, (char**)bufferInOut, 
bufferLengthInOut, bufferContentLengthOut);
 }
 
 celix_status_t pubsubProtocol_encodeFooter(void *handle 
__attribute__((unused)), pubsub_protocol_message_t *message 
__attribute__((unused)), void **outBuffer, size_t *outLength) {
+    message->header.convertEndianess = true;
     return pubsubProtocol_getFooterSize(handle,  outLength);
 }
 
 celix_status_t pubsubProtocol_v1_decodePayload(void* handle 
__attribute__((unused)), void *data, size_t length, pubsub_protocol_message_t 
*message){
+    message->header.convertEndianess = true;
     return pubsubProtocol_decodePayload(data, length, message);
 }
 
 celix_status_t pubsubProtocol_v1_decodeMetadata(void* handle 
__attribute__((unused)), void *data, size_t length, pubsub_protocol_message_t 
*message) {
+    message->header.convertEndianess = true;
     return pubsubProtocol_decodeMetadata(data, length, message);
 }
 
@@ -143,7 +147,7 @@ celix_status_t pubsubProtocol_decodeHeader(void *handle, 
void *data, size_t leng
     pubsubProtocol_getHeaderSize(handle, &headerSize);
     if (length == headerSize) {
         unsigned int sync;
-        idx = pubsubProtocol_readInt(data, idx,  BYTESWAP_SYNC, &sync);
+        idx = pubsubProtocol_readInt(data, idx,  true, &sync);
         if (sync != PROTOCOL_WIRE_V1_SYNC_HEADER) {
             status = CELIX_ILLEGAL_ARGUMENT;
         } else {
@@ -157,6 +161,7 @@ celix_status_t pubsubProtocol_decodeHeader(void *handle, 
void *data, size_t leng
                 idx = pubsubProtocol_readShort(data, idx, true, 
&message->header.msgMinorVersion);
                 idx = pubsubProtocol_readInt(data, idx,  true, 
&message->header.payloadSize);
                 pubsubProtocol_readInt(data, idx,  true, 
&message->header.metadataSize);
+                message->header.convertEndianess = true;
                 // Set message segmentation parameters to defaults
                 message->header.seqNr           = 0;
                 message->header.payloadPartSize = message->header.payloadSize;
diff --git a/misc/error_injector/CMakeLists.txt 
b/misc/error_injector/CMakeLists.txt
index a522ac19..0da41a89 100644
--- a/misc/error_injector/CMakeLists.txt
+++ b/misc/error_injector/CMakeLists.txt
@@ -22,4 +22,5 @@ target_link_libraries(error_injector INTERFACE dl)
 target_link_options(error_injector INTERFACE -rdynamic)
 target_compile_options(error_injector INTERFACE -Wno-frame-address)
 
-add_subdirectory(malloc)
\ No newline at end of file
+add_subdirectory(malloc)
+add_subdirectory(celix_properties)
diff --git a/misc/error_injector/malloc/CMakeLists.txt 
b/misc/error_injector/celix_properties/CMakeLists.txt
similarity index 73%
copy from misc/error_injector/malloc/CMakeLists.txt
copy to misc/error_injector/celix_properties/CMakeLists.txt
index 130a1239..c85bf74a 100644
--- a/misc/error_injector/malloc/CMakeLists.txt
+++ b/misc/error_injector/celix_properties/CMakeLists.txt
@@ -15,9 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_library(malloc_ei STATIC malloc_ei.cpp)
+add_library(celix_properties_ei STATIC celix_properties_ei.cpp)
 
-target_include_directories(malloc_ei PUBLIC ${CMAKE_CURRENT_LIST_DIR})
-target_link_libraries(malloc_ei PUBLIC error_injector)
+target_include_directories(celix_properties_ei PUBLIC 
${CMAKE_CURRENT_LIST_DIR})
+target_link_libraries(celix_properties_ei PUBLIC error_injector Celix::utils)
 # It plays nicely with address sanitizer this way.
-target_link_options(malloc_ei INTERFACE -Wl,-wrap,malloc -Wl,-wrap,realloc)
\ No newline at end of file
+target_link_options(celix_properties_ei INTERFACE 
-Wl,-wrap,celix_properties_create)
\ No newline at end of file
diff --git a/misc/error_injector/malloc/malloc_ei.h 
b/misc/error_injector/celix_properties/celix_properties_ei.cpp
similarity index 74%
copy from misc/error_injector/malloc/malloc_ei.h
copy to misc/error_injector/celix_properties/celix_properties_ei.cpp
index 7d00c327..213fbdf9 100644
--- a/misc/error_injector/malloc/malloc_ei.h
+++ b/misc/error_injector/celix_properties/celix_properties_ei.cpp
@@ -17,18 +17,13 @@
   under the License.
  */
 
-#ifndef CELIX_MALLOC_EI_H
-#define CELIX_MALLOC_EI_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <error_injector.h>
+#include <celix_properties_ei.h>
 
-CELIX_EI_DECLARE(malloc, void *);
-CELIX_EI_DECLARE(realloc, void *);
-
-#ifdef __cplusplus
+extern "C" {
+void *__real_celix_properties_create(void);
+CELIX_EI_DEFINE(celix_properties_create, celix_properties_t*)
+void *__wrap_celix_properties_create(void) {
+    CELIX_EI_IMPL0(celix_properties_create);
+    return __real_celix_properties_create();
 }
-#endif
-#endif //CELIX_MALLOC_EI_H
+}
\ No newline at end of file
diff --git a/misc/error_injector/malloc/malloc_ei.h 
b/misc/error_injector/celix_properties/celix_properties_ei.h
similarity index 81%
copy from misc/error_injector/malloc/malloc_ei.h
copy to misc/error_injector/celix_properties/celix_properties_ei.h
index 7d00c327..f5b1c084 100644
--- a/misc/error_injector/malloc/malloc_ei.h
+++ b/misc/error_injector/celix_properties/celix_properties_ei.h
@@ -17,18 +17,18 @@
   under the License.
  */
 
-#ifndef CELIX_MALLOC_EI_H
-#define CELIX_MALLOC_EI_H
+#ifndef CELIX_CELIX_PROPERTIES_EI_H
+#define CELIX_CELIX_PROPERTIES_EI_H
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#include <celix_properties.h>
 #include <error_injector.h>
 
-CELIX_EI_DECLARE(malloc, void *);
-CELIX_EI_DECLARE(realloc, void *);
+CELIX_EI_DECLARE(celix_properties_create, celix_properties_t*);
 
 #ifdef __cplusplus
 }
 #endif
-#endif //CELIX_MALLOC_EI_H
+#endif //CELIX_CELIX_PROPERTIES_EI_H
diff --git a/misc/error_injector/malloc/CMakeLists.txt 
b/misc/error_injector/malloc/CMakeLists.txt
index 130a1239..543060bc 100644
--- a/misc/error_injector/malloc/CMakeLists.txt
+++ b/misc/error_injector/malloc/CMakeLists.txt
@@ -20,4 +20,4 @@ add_library(malloc_ei STATIC malloc_ei.cpp)
 target_include_directories(malloc_ei PUBLIC ${CMAKE_CURRENT_LIST_DIR})
 target_link_libraries(malloc_ei PUBLIC error_injector)
 # It plays nicely with address sanitizer this way.
-target_link_options(malloc_ei INTERFACE -Wl,-wrap,malloc -Wl,-wrap,realloc)
\ No newline at end of file
+target_link_options(malloc_ei INTERFACE -Wl,-wrap,malloc -Wl,-wrap,realloc 
-Wl,-wrap,calloc)
\ No newline at end of file
diff --git a/misc/error_injector/malloc/malloc_ei.cpp 
b/misc/error_injector/malloc/malloc_ei.cpp
index aadb4f28..d760697c 100644
--- a/misc/error_injector/malloc/malloc_ei.cpp
+++ b/misc/error_injector/malloc/malloc_ei.cpp
@@ -33,4 +33,11 @@ void *__wrap_realloc(void *__ptr, size_t __size) {
     CELIX_EI_IMPL0(realloc);
     return __real_realloc(__ptr, __size);
 }
+
+void *__real_calloc (size_t __nmemb, size_t __size);
+CELIX_EI_DEFINE(calloc, void *)
+void *__wrap_calloc (size_t __nmemb, size_t __size) {
+    CELIX_EI_IMPL0(calloc);
+    return __real_calloc(__nmemb, __size);
+}
 }
\ No newline at end of file
diff --git a/misc/error_injector/malloc/malloc_ei.h 
b/misc/error_injector/malloc/malloc_ei.h
index 7d00c327..8479af63 100644
--- a/misc/error_injector/malloc/malloc_ei.h
+++ b/misc/error_injector/malloc/malloc_ei.h
@@ -27,6 +27,7 @@ extern "C" {
 
 CELIX_EI_DECLARE(malloc, void *);
 CELIX_EI_DECLARE(realloc, void *);
+CELIX_EI_DECLARE(calloc, void *);
 
 #ifdef __cplusplus
 }

Reply via email to