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) ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports.http://sdm.link/zohodev2dev _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel