|
From: Zoran M. <zor...@er...> - 2016-07-15 21:57:36
|
osaf/libs/agents/saf/clma/clma_api.c | 85 ++++++++++++++++++++++++---------
osaf/libs/agents/saf/clma/clma_util.c | 14 +++++
osaf/libs/common/clmsv/clmsv_enc_dec.c | 32 ++++++++----
3 files changed, 96 insertions(+), 35 deletions(-)
Add support for long RDN to support RDN values longer than 64 bytes
diff --git a/osaf/libs/agents/saf/clma/clma_api.c b/osaf/libs/agents/saf/clma/clma_api.c
--- a/osaf/libs/agents/saf/clma/clma_api.c
+++ b/osaf/libs/agents/saf/clma/clma_api.c
@@ -31,6 +31,7 @@
#include "clma.h"
#include "ncs_main_papi.h"
+#include "osaf_extended_name.h"
#define CLMS_WAIT_TIME 1000
#define CLM_API_MIN_TIMEOUT 10 /* ten milli seconds */
@@ -84,10 +85,7 @@ void clma_fill_node_from_node4(SaClmClus
clusterNode->nodeAddress.length = clusterNode_4.nodeAddress.length;
(void)memcpy(clusterNode->nodeAddress.value, clusterNode_4.nodeAddress.value, clusterNode->nodeAddress.length);
clusterNode->nodeName.length = clusterNode_4.nodeName.length;
- (void)memcpy(clusterNode->nodeName.value, clusterNode_4.nodeName.value, clusterNode->nodeName.length);
- clusterNode->nodeName.value[clusterNode->nodeName.length <
- SA_MAX_NAME_LENGTH ? clusterNode->nodeName.length :
- SA_MAX_NAME_LENGTH - 1] = '\0';
+ osaf_extended_name_alloc(osaf_extended_name_borrow(&clusterNode_4.nodeName), &clusterNode->nodeName);
clusterNode->member = clusterNode_4.member;
clusterNode->bootTimestamp = clusterNode_4.bootTimestamp;
clusterNode->initialViewNumber = clusterNode_4.initialViewNumber;
@@ -119,8 +117,17 @@ static SaAisErrorT clma_validate_flags_b
/* validate the notify buffer */
if ((flags & SA_TRACK_CURRENT) && buf && buf->notification) {
+ uint32_t i;
+
if (!buf->numberOfItems)
return SA_AIS_ERR_INVALID_PARAM;
+
+ // Check that nodeName is not longer than 255
+ for(i=0; i<buf->numberOfItems; i++) {
+ if(osaf_extended_name_length(&buf->notification[i].clusterNode.nodeName) >= SA_MAX_NAME_LENGTH) {
+ return SA_AIS_ERR_INVALID_PARAM;
+ }
+ }
}
/* Validate if flag is TRACK_CURRENT and no callback and no buffer provided */
@@ -160,10 +167,24 @@ static SaAisErrorT clma_validate_flags_b
/* validate the notify buffer */
if ((flags & SA_TRACK_CURRENT) && buf && buf->notification) {
+ uint32_t i;
+
if (!buf->numberOfItems) {
TRACE_LEAVE();
return SA_AIS_ERR_INVALID_PARAM;
}
+
+ // Check that nodeName and EE are not longer than 255
+ for(i=0; i<buf->numberOfItems; i++) {
+ if(osaf_extended_name_length(&buf->notification[i].clusterNode.nodeName) >= SA_MAX_NAME_LENGTH) {
+ TRACE_LEAVE();
+ return SA_AIS_ERR_INVALID_PARAM;
+ }
+ if(osaf_extended_name_length(&buf->notification[i].clusterNode.executionEnvironment) >= SA_MAX_NAME_LENGTH) {
+ TRACE_LEAVE();
+ return SA_AIS_ERR_INVALID_PARAM;
+ }
+ }
}
/* Validate if flag is TRACK_CURRENT and no callback and no buffer provided */
@@ -228,16 +249,18 @@ static SaAisErrorT clma_fill_cluster_ntf
return SA_AIS_ERR_NO_MEMORY;
if (buf_4->notification != NULL &&
- (buf_4->numberOfItems >= msg_rsp->info.api_resp_info.param.track.notify_info->numberOfItems)) {
+ (buf_4->numberOfItems >= msg_rsp->info.api_resp_info.param.track.notify_info->numberOfItems)) {
/* Overwrite the numberOfItems and copy it to buffer */
buf_4->numberOfItems = msg_rsp->info.api_resp_info.param.track.notify_info->numberOfItems;
buf_4->viewNumber = msg_rsp->info.api_resp_info.param.track.notify_info->viewNumber;
memset(buf_4->notification, 0, sizeof(SaClmClusterNotificationT_4) * buf_4->numberOfItems);
memcpy(buf_4->notification, msg_rsp->info.api_resp_info.param.track.notify_info->notification,
- sizeof(SaClmClusterNotificationT_4) * buf_4->numberOfItems);
- } else if(buf_4->notification != NULL &&
- (buf_4->numberOfItems < msg_rsp->info.api_resp_info.param.track.notify_info->numberOfItems)) {
+ sizeof(SaClmClusterNotificationT_4) * buf_4->numberOfItems);
+
+ /* TODO: Code for copying long DNs for nodeName and EE when full long DN support is implemented. */
+ } else if(buf_4->notification != NULL &&
+ (buf_4->numberOfItems < msg_rsp->info.api_resp_info.param.track.notify_info->numberOfItems)) {
return SA_AIS_ERR_NO_SPACE;
} else {
/* we need to ignore the numberOfItems and allocate the space
@@ -250,6 +273,7 @@ static SaAisErrorT clma_fill_cluster_ntf
memcpy(buf_4->notification, msg_rsp->info.api_resp_info.param.track.notify_info->notification,
sizeof(SaClmClusterNotificationT_4) * buf_4->numberOfItems);
+ /* TODO: Code for copying long DNs for nodeName and EE when full long DN support is implemented. */
}
return SA_AIS_OK;
}
@@ -470,10 +494,8 @@ void clma_fill_clusterbuf_from_buf_4(SaC
(void)memcpy(buf->notification[i].clusterNode.nodeAddress.value,
buf_4->notification[i].clusterNode.nodeAddress.value,
buf->notification[i].clusterNode.nodeAddress.length);
- buf->notification[i].clusterNode.nodeName.length = buf_4->notification[i].clusterNode.nodeName.length;
- (void)memcpy(buf->notification[i].clusterNode.nodeName.value,
- buf_4->notification[i].clusterNode.nodeName.value,
- buf->notification[i].clusterNode.nodeName.length);
+ osaf_extended_name_alloc(osaf_extended_name_borrow(&buf_4->notification[i].clusterNode.nodeName),
+ &buf->notification[i].clusterNode.nodeName);
buf->notification[i].clusterNode.member = buf_4->notification[i].clusterNode.member;
buf->notification[i].clusterNode.bootTimestamp = buf_4->notification[i].clusterNode.bootTimestamp;
buf->notification[i].clusterNode.initialViewNumber =
@@ -1311,11 +1333,11 @@ static SaAisErrorT clmaclusternodeget(Sa
}
}
- if((hdl_rec->is_configured == false) && (!clma_validate_version(hdl_rec->version))) {
- TRACE("Node is unconfigured");
- rc = SA_AIS_ERR_UNAVAILABLE;
- goto done_give_hdl;
- }
+ if((hdl_rec->is_configured == false) && (!clma_validate_version(hdl_rec->version))) {
+ TRACE("Node is unconfigured");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
if((hdl_rec->is_member == false) && (!clma_validate_version(hdl_rec->version))) {
TRACE("Node is not a member");
@@ -1351,12 +1373,25 @@ static SaAisErrorT clmaclusternodeget(Sa
} else
rc = SA_AIS_ERR_NO_RESOURCES;
+ if (rc == SA_AIS_OK
+ && osaf_extended_name_length(&o_msg->info.api_resp_info.param.node_get.nodeName) >= SA_MAX_NAME_LENGTH) {
+ TRACE("nodeName is longer than 255");
+ rc = SA_AIS_ERR_NO_RESOURCES;
+ }
+
if (rc == SA_AIS_OK) {
if (clma_validate_version(hdl_rec->version)) {
clma_fill_node_from_node4(cluster_node, o_msg->info.api_resp_info.param.node_get);
- } else {
+ } else if(osaf_extended_name_length(&o_msg->info.api_resp_info.param.node_get.executionEnvironment) < SA_MAX_NAME_LENGTH) {
memset(cluster_node_4, 0, sizeof(SaClmClusterNodeT_4));
memcpy(cluster_node_4, &o_msg->info.api_resp_info.param.node_get, sizeof(SaClmClusterNodeT_4));
+ /* TODO: When full long DN support is implemented, remove comment to ensure that long DN is safely copied.
+ * Now it's overhead for copying the same data. */
+ //osaf_extended_name_alloc(osaf_extended_name_borrow(&o_msg->info.api_resp_info.param.node_get.nodeName), &cluster_node_4->nodeName);
+ //osaf_extended_name_alloc(osaf_extended_name_borrow(&o_msg->info.api_resp_info.param.node_get.executionEnvironment), &cluster_node_4->executionEnvironment);
+ } else {
+ TRACE("executionEnvironment is longer than 255");
+ rc = SA_AIS_ERR_NO_RESOURCES;
}
}
@@ -1512,11 +1547,15 @@ SaAisErrorT saClmClusterNotificationFree
goto done_give_hdl;
}
- if((hdl_rec->is_configured == false) && (!clma_validate_version(hdl_rec->version))) {
- TRACE("Node is unconfigured");
- rc = SA_AIS_ERR_UNAVAILABLE;
- goto done_give_hdl;
- }
+ if((hdl_rec->is_configured == false) && (!clma_validate_version(hdl_rec->version))) {
+ TRACE("Node is unconfigured");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
+
+ // Free allocated memory for long DN
+ osaf_extended_name_free(¬ification->clusterNode.nodeName);
+ osaf_extended_name_free(¬ification->clusterNode.executionEnvironment);
free(notification);
diff --git a/osaf/libs/agents/saf/clma/clma_util.c b/osaf/libs/agents/saf/clma/clma_util.c
--- a/osaf/libs/agents/saf/clma/clma_util.c
+++ b/osaf/libs/agents/saf/clma/clma_util.c
@@ -659,6 +659,13 @@ void clma_msg_destroy(CLMSV_MSG * msg)
if (msg->evt_type == CLMSV_CLMS_TO_CLMA_API_RESP_MSG) {
if (msg->info.api_resp_info.type == CLMSV_TRACK_CURRENT_RESP) {
+ /* TODO: if long DN longer than 255 characters is fully implemented
+ * then freeing of each SaNameT in notification list must be done
+ * msg->info.api_resp_info.param.track.notify_info->notification->clusterNode.nodeName
+ * and
+ * msg->info.api_resp_info.param.track.notify_info->notification->clusterNode.executionEnvironment
+ * must be done here
+ */
if (msg->info.api_resp_info.param.track.notify_info->numberOfItems)
free(msg->info.api_resp_info.param.track.notify_info->notification);
@@ -666,6 +673,13 @@ void clma_msg_destroy(CLMSV_MSG * msg)
}
} else if (msg->evt_type == CLMSV_CLMS_TO_CLMA_CBK_MSG) {
if (msg->info.cbk_info.type == CLMSV_TRACK_CBK) {
+ /* TODO: if long DN longer than 255 characters is fully implemented
+ * then freeing of each SaNameT in notification list
+ * msg->info.cbk_info.param.track.buf_info.notification->clusterNode.nodeName
+ * and
+ * msg->info.cbk_info.param.track.buf_info.notification->clusterNode.executionEnvironment
+ * must be done here
+ */
if (msg->info.cbk_info.param.track.buf_info.numberOfItems)
free(msg->info.cbk_info.param.track.buf_info.notification);
diff --git a/osaf/libs/common/clmsv/clmsv_enc_dec.c b/osaf/libs/common/clmsv/clmsv_enc_dec.c
--- a/osaf/libs/common/clmsv/clmsv_enc_dec.c
+++ b/osaf/libs/common/clmsv/clmsv_enc_dec.c
@@ -17,26 +17,32 @@
#include <ncsencdec_pub.h>
#include "clmsv_enc_dec.h"
#include "clmsv_msg.h"
+#include "osaf_extended_name.h"
uint32_t clmsv_decodeSaNameT(NCS_UBAID *uba, SaNameT *name)
{
uint8_t local_data[2];
uint8_t *p8 = NULL;
uint32_t total_bytes = 0;
+ uint16_t length;
+ char valueBuffer[256];
+ char *value = valueBuffer;
p8 = ncs_dec_flatten_space(uba, local_data, 2);
- name->length = ncs_decode_16bit(&p8);
- if (name->length > SA_MAX_NAME_LENGTH) {
- LOG_ER("SaNameT length too long: %hd", name->length);
+ length = ncs_decode_16bit(&p8);
+ if (!osaf_is_extended_names_enabled() && length >= SA_MAX_NAME_LENGTH) {
+ LOG_ER("SaNameT length too long: %hd", length);
/* this should not happen */
osafassert(0);
}
+ if(length >= SA_MAX_NAME_LENGTH) {
+ value = (char *)calloc(1, length + 1);
+ }
ncs_dec_skip_space(uba, 2);
total_bytes += 2;
- ncs_decode_n_octets_from_uba(uba, name->value, (uint32_t)name->length);
- name->value[name->length < SA_MAX_NAME_LENGTH ? name->length :
- SA_MAX_NAME_LENGTH - 1] = '\0';
- total_bytes += name->length;
+ ncs_decode_n_octets_from_uba(uba, (uint8_t *)value, (uint32_t)length);
+ osaf_extended_name_lend(value, name);
+ total_bytes += length;
return total_bytes;
}
@@ -63,7 +69,6 @@ uint32_t clmsv_decodeNodeAddressT(NCS_UB
ncs_decode_n_octets_from_uba(uba, nodeAddress->value, (uint32_t)nodeAddress->length);
total_bytes += nodeAddress->length;
return total_bytes;
-
}
uint32_t clmsv_encodeSaNameT(NCS_UBAID *uba, SaNameT *name)
@@ -71,20 +76,23 @@ uint32_t clmsv_encodeSaNameT(NCS_UBAID *
TRACE_ENTER();
uint8_t *p8 = NULL;
uint32_t total_bytes = 0;
+ size_t length;
+
p8 = ncs_enc_reserve_space(uba, 2);
if (!p8) {
TRACE("p8 NULL!!!");
return 0;
}
- if (name->length > SA_MAX_NAME_LENGTH) {
+ if (!osaf_is_extended_names_enabled() && name->length >= SA_MAX_NAME_LENGTH) {
LOG_ER("SaNameT length too long %hd", name->length);
osafassert(0);
}
- ncs_encode_16bit(&p8, name->length);
+ length = osaf_extended_name_length(name);
+ ncs_encode_16bit(&p8, length);
ncs_enc_claim_space(uba, 2);
total_bytes += 2;
- ncs_encode_n_octets_in_uba(uba, name->value, (uint32_t)name->length);
- total_bytes += (uint32_t)name->length;
+ ncs_encode_n_octets_in_uba(uba, (uint8_t *)osaf_extended_name_borrow(name), length);
+ total_bytes += (uint32_t)length;
TRACE_LEAVE();
return total_bytes;
}
|