|
From: Zoran M. <zor...@er...> - 2016-07-15 21:54:24
|
osaf/services/saf/clmsv/clms/clms_imm.c | 73 +++++++++++++++++++++++++++----
osaf/services/saf/clmsv/clms/clms_main.c | 5 ++
osaf/services/saf/clmsv/clms/clms_util.c | 7 +++
3 files changed, 75 insertions(+), 10 deletions(-)
Add support for long RDN to support RDN values longer than 64 bytes
diff --git a/osaf/services/saf/clmsv/clms/clms_imm.c b/osaf/services/saf/clmsv/clms/clms_imm.c
--- a/osaf/services/saf/clmsv/clms/clms_imm.c
+++ b/osaf/services/saf/clmsv/clms/clms_imm.c
@@ -18,6 +18,7 @@
#include <saImmOi.h>
#include "clms.h"
+#include "osaf_extended_name.h"
extern struct ImmutilWrapperProfile immutilWrapperProfile;
@@ -222,9 +223,17 @@ CLMS_CLUSTER_NODE *clms_node_new(SaNameT
} else if (!strcmp(attr->attrName, "saClmNodeEE")) {
SaNameT *name = (SaNameT *)value;
- TRACE("saClmNodeEE attribute name's length %d", name->length);
-
- if (name->length != 0) {
+ size_t nameLen = osaf_extended_name_length(name);
+
+ TRACE("saClmNodeEE attribute name's length %lu", nameLen);
+
+ if (nameLen != 0) {
+ if (nameLen >= SA_MAX_NAME_LENGTH) {
+ LOG_ER("saClmNodeEE attribute name length is longer than 255");
+ free(node);
+ node = NULL;
+ goto done;
+ }
if (strncmp((const char *)name->value,"safEE=",6)){
LOG_ER("Please provide the saf compliant ee name");
free(node);
@@ -1383,8 +1392,19 @@ static SaAisErrorT clms_imm_ccb_obj_crea
uint32_t rt;
CcbUtilCcbData_t *ccb_util_ccb_data;
CcbUtilOperationData_t *operation = NULL;
-
- TRACE_ENTER2("CCB ID %llu, class %s, parent %s", ccbId, className, parentName->value);
+ size_t parentNameLen = 0;
+
+ TRACE_ENTER2("CCB ID %llu, class %s, parent %s", ccbId, className,
+ parentName ? osaf_extended_name_borrow(parentName) : "(null)");
+
+ if(parentName) {
+ parentNameLen = osaf_extended_name_length(parentName);
+ if(parentNameLen >= SA_MAX_NAME_LENGTH) {
+ LOG_ER("Parent name is longer than 255");
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ goto done;
+ }
+ }
if ((ccb_util_ccb_data = ccbutil_getCcbData(ccbId)) != NULL) {
int i = 0;
@@ -1406,17 +1426,30 @@ static SaAisErrorT clms_imm_ccb_obj_crea
} else if (!strncmp(attrValue->attrName, "safNode", 7)) {
if (attrValue->attrValueType == SA_IMM_ATTR_SASTRINGT) {
SaStringT rdnVal = *((SaStringT *)attrValue->attrValues[0]);
- if ((parentName != NULL) && (parentName->length > 0)) {
+ if ((parentName != NULL) && (parentNameLen > 0)
+ && (strlen(rdnVal) + parentNameLen + 1) < SA_MAX_NAME_LENGTH) {
operation->objectName.length =
- (SaUint16T)sprintf((char *)operation->objectName.value, "%s,%s",
- rdnVal, parentName->value);
+ (SaUint16T)sprintf((char *)operation->objectName.value, "%s,%s",
+ rdnVal, parentName->value);
} else {
+ if(!parentName || parentNameLen == 0) {
+ LOG_ER("Node DN name is incorrect. Parent is NULL or empty");
+ } else {
+ LOG_ER("Node DN name is incorrect. DN is longer than 255");
+ }
rc = SA_AIS_ERR_BAD_OPERATION;
+ goto done;
}
}
TRACE("Operation's object Name %s", operation->objectName.value);
-
+ } else if (!strncmp(attrValue->attrName, "saClmNodeEE", 11) && attrValue->attrValuesNumber == 1) {
+ SaNameT *name = (SaNameT *)attrValue->attrValues[0];
+ if(osaf_extended_name_length(name) >= SA_MAX_NAME_LENGTH) {
+ LOG_ER("saClmNodeEE is longer than 255");
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ goto done;
+ }
}
}
}
@@ -1471,17 +1504,37 @@ static SaAisErrorT clms_imm_ccb_obj_modi
{
SaAisErrorT rc = SA_AIS_OK;
struct CcbUtilCcbData *ccbUtilCcbData;
+ int i = 0;
+ SaImmAttrModificationT_2 *attrMod;
+ SaNameT *name;
TRACE_ENTER2("CCB ID %llu for object-name:%s ", ccbId, objectName->value);
if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) != NULL) {
+ /* saClmNodeEE cannot be longer than 255 */
+ while ((attrMod = (SaImmAttrModificationT_2 *)attrMods[i++]) != NULL) {
+ if (strncmp(attrMod->modAttr.attrName, "saClmNodeEE", 11) != 0)
+ continue;
+
+ if(attrMod->modAttr.attrValuesNumber == 0) {
+ break;
+ }
+
+ name = (SaNameT *)attrMod->modAttr.attrValues[0];
+ if(osaf_extended_name_length(name) >= SA_MAX_NAME_LENGTH) {
+ LOG_ER("saClmNodeEE is longer than 255");
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ break;
+ }
+ }
+
/*memorize the modification request */
if (ccbutil_ccbAddModifyOperation(ccbUtilCcbData, objectName, attrMods) != 0) {
LOG_ER("Failed ccb object modify %s", objectName->value);
rc = SA_AIS_ERR_BAD_OPERATION;
}
} else {
- LOG_ER("Failed to get CCB objectfor %llu", ccbId);
+ LOG_ER("Failed to get CCB object for %llu", ccbId);
rc = SA_AIS_ERR_NO_MEMORY;
}
diff --git a/osaf/services/saf/clmsv/clms/clms_main.c b/osaf/services/saf/clmsv/clms/clms_main.c
--- a/osaf/services/saf/clmsv/clms/clms_main.c
+++ b/osaf/services/saf/clmsv/clms/clms_main.c
@@ -446,6 +446,11 @@ int main(int argc, char *argv[])
daemonize(argc, argv);
+ if(setenv("SA_ENABLE_EXTENDED_NAMES", "1", 1)) {
+ LOG_ER("Failed to set SA_ENABLE_EXTENDED_NAMES");
+ goto done;
+ }
+
if (clms_init() != NCSCC_RC_SUCCESS) {
LOG_ER("clms_init failed");
goto done;
diff --git a/osaf/services/saf/clmsv/clms/clms_util.c b/osaf/services/saf/clmsv/clms/clms_util.c
--- a/osaf/services/saf/clmsv/clms/clms_util.c
+++ b/osaf/services/saf/clmsv/clms/clms_util.c
@@ -17,6 +17,7 @@
#include "clms.h"
#include "osaf_time.h"
+#include "osaf_extended_name.h"
static const SaNameT _clmSvcUsrName = {
.value = "safApp=safClmService",
@@ -292,6 +293,12 @@ uint32_t clms_node_dn_chk(SaNameT *objNa
char *tmpstr;
TRACE_ENTER();
+ if(osaf_extended_name_length(objName) >= SA_MAX_NAME_LENGTH) {
+ LOG_ER("Object name is longer than 255: %s", osaf_extended_name_borrow(objName));
+ TRACE_LEAVE();
+ return NCSCC_RC_FAILURE;
+ }
+
if (!strncmp((char *)objName->value, "safNode=", 8)) {
tmpstr = strchr((char *)objName->value, ',');
if (tmpstr != NULL)
|