src/imm/immnd/ImmModel.cc |  94 ++++++++++++++++++++++++++---------------------
 1 files changed, 52 insertions(+), 42 deletions(-)


ImmModel::notCompatibleAtt()
Check for dangling values when adding NO_DANGLING flag to SaStringDN attributes.

ImmModel::ccbObjectModify()
Check for SaStringDN attributes that have long DN values before disabling long 
DN (setting longDnsAllowed to 0).

ImmModel::rtObjectCreate()
When long DN is disabled, don't allow creating runtime objects with SaStringDN 
attributes that have long DN value.

ImmModel::rtObjectUpdate()
When long DN is disabled, don't allow setting long DN value to SaStringDN 
attributes.

diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc
--- a/src/imm/immnd/ImmModel.cc
+++ b/src/imm/immnd/ImmModel.cc
@@ -4563,8 +4563,12 @@ ImmModel::notCompatibleAtt(const std::st
 
         /* "changedAttrs != NULL" ensures that this check is only for the 
schema update */
         if(checkNoDanglingRefs && changedAttrs) {
-            if(newAttr->mValueType != SA_IMM_ATTR_SANAMET)
+            if (newAttr->mValueType != SA_IMM_ATTR_SANAMET &&
+                    !(newAttr->mValueType == SA_IMM_ATTR_SASTRINGT && 
(newAttr->mFlags & SA_IMM_ATTR_DN))) {
+                LOG_NO("Impossible upgrade, attribute %s:%s adds/removes 
SA_IMM_ATTR_NO_DANGLING flag, ",
+                       className.c_str(), attName.c_str());
                 return true;
+            }
 
             ClassMap::iterator cmi = sClassMap.find(className);
             osafassert(cmi != sClassMap.end());
@@ -9779,8 +9783,9 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                                             goto bypass_impl;
                                         }
                                     }
-                                } else if((i4->second->mValueType == 
SA_IMM_ATTR_SANAMET) && 
-                                             !(i4->second->mFlags & 
SA_IMM_ATTR_NO_DANGLING))
+                                } else if ((i4->second->mValueType == 
SA_IMM_ATTR_SANAMET ||
+                                        (i4->second->mValueType == 
SA_IMM_ATTR_SASTRINGT && (i4->second->mFlags & SA_IMM_ATTR_DN))) &&
+                                        !(i4->second->mFlags & 
SA_IMM_ATTR_NO_DANGLING))
                                 {
                                     /* DN limit check for attribute that is:
                                        not the RDN attribute (else branch here)
@@ -15894,7 +15899,7 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
             objectName.append((const char*)attrValues->n.attrValue.val.x.buf, 
                 strnlen((const char*)attrValues->n.attrValue.val.x.buf,
                     (size_t)attrValues->n.attrValue.val.x.size));
-        } else if (attrValues->n.attrValueType == SA_IMM_ATTR_SANAMET
+        } else if ((attrValues->n.attrValueType == SA_IMM_ATTR_SANAMET || 
attrValues->n.attrValueType == SA_IMM_ATTR_SASTRINGT)
                 && !longDnsPermitted) {
             AttrMap::iterator it = classInfo->mAttrMap.find(attrName);
             if(it == classInfo->mAttrMap.end()) {
@@ -15903,24 +15908,27 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
                 err = SA_AIS_ERR_INVALID_PARAM;
                 goto rtObjectCreateExit;
             }
-            if(attrValues->n.attrValue.val.x.size >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
-                LOG_NO("ERR_NAME_TOO_LONG: Attribute '%s' has long DN. "
-                    "Not allowed by IMM service or extended names are 
disabled",
-                    attrName.c_str());
-                err = SA_AIS_ERR_NAME_TOO_LONG;
-                goto rtObjectCreateExit;
-            }
-
-            IMMSV_EDU_ATTR_VAL_LIST *value = attrValues->n.attrMoreValues;
-            while(value) {
-                if(value->n.val.x.size >= SA_MAX_UNEXTENDED_NAME_LENGTH) {
+
+            if (attrValues->n.attrValueType == SA_IMM_ATTR_SANAMET || 
(it->second->mFlags & SA_IMM_ATTR_DN)) {
+                if(attrValues->n.attrValue.val.x.size >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
                     LOG_NO("ERR_NAME_TOO_LONG: Attribute '%s' has long DN. "
                         "Not allowed by IMM service or extended names are 
disabled",
                         attrName.c_str());
                     err = SA_AIS_ERR_NAME_TOO_LONG;
                     goto rtObjectCreateExit;
                 }
-                value = value->next;
+
+                IMMSV_EDU_ATTR_VAL_LIST *value = attrValues->n.attrMoreValues;
+                while(value) {
+                    if(value->n.val.x.size >= SA_MAX_UNEXTENDED_NAME_LENGTH) {
+                        LOG_NO("ERR_NAME_TOO_LONG: Attribute '%s' has long DN. 
"
+                            "Not allowed by IMM service or extended names are 
disabled",
+                            attrName.c_str());
+                        err = SA_AIS_ERR_NAME_TOO_LONG;
+                        goto rtObjectCreateExit;
+                    }
+                    value = value->next;
+                }
             }
         }
         attrValues = attrValues->next;
@@ -17276,33 +17284,35 @@ ImmModel::rtObjectUpdate(const ImmsvOmCc
                 break; //out of while-loop
             }
 
+            if((attr->mValueType == SA_IMM_ATTR_SANAMET ||
+                    (attr->mValueType == SA_IMM_ATTR_SASTRINGT && 
(attr->mFlags & SA_IMM_ATTR_DN))) &&
+                    !longDnsPermitted) {
+                if(p->attrValue.attrValue.val.x.size >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
+                    LOG_NO("ERR_BAD_OPERATION: Attribute '%s' has long DN. "
+                        "Not allowed by IMM service or extended names are 
disabled",
+                        attrName.c_str());
+                    err = SA_AIS_ERR_BAD_OPERATION;
+                    break; //out of while-loop
+                }
+                if((attr->mFlags & SA_IMM_ATTR_MULTI_VALUE) && 
p->attrValue.attrValuesNumber > 1) {
+                    IMMSV_EDU_ATTR_VAL_LIST *values = 
p->attrValue.attrMoreValues;
+                    while(values) {
+                        if(values->n.val.x.size >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
+                            LOG_NO("ERR_BAD_OPERATION: Attribute '%s' has long 
DN. "
+                                "Not allowed by IMM service or extended names 
are disabled",
+                                attrName.c_str());
+                            err = SA_AIS_ERR_BAD_OPERATION;
+                            break; //out of while-loop
+                        }
+                        values = values->next;
+                    }
+                    if(err != SA_AIS_OK) {
+                        break; //out of while-loop
+                    }
+                }
+            }
+
             if(attr->mValueType == SA_IMM_ATTR_SANAMET) {
-                if(!longDnsPermitted) {
-                    if(p->attrValue.attrValue.val.x.size >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
-                        LOG_NO("ERR_BAD_OPERATION: Attribute '%s' has long DN. 
"
-                            "Not allowed by IMM service or extended names are 
disabled",
-                            attrName.c_str());
-                        err = SA_AIS_ERR_BAD_OPERATION;
-                        break;
-                    }
-                    if((attr->mFlags & SA_IMM_ATTR_MULTI_VALUE) && 
p->attrValue.attrValuesNumber > 1) {
-                        IMMSV_EDU_ATTR_VAL_LIST *values = 
p->attrValue.attrMoreValues;
-                        while(values) {
-                            if(values->n.val.x.size >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
-                                LOG_NO("ERR_BAD_OPERATION: Attribute '%s' has 
long DN. "
-                                    "Not allowed by IMM service or extended 
names are disabled",
-                                    attrName.c_str());
-                                err = SA_AIS_ERR_BAD_OPERATION;
-                                break;
-                            }
-                            values = values->next;
-                        }
-                        if(err != SA_AIS_OK) {
-                            break;
-                        }
-                    }
-                }
-
                 if (p->attrValue.attrValue.val.x.size > kOsafMaxDnLength) {
                     LOG_NO("ERR_LIBRARY: attr '%s' of type SaNameT is too 
long:%u",
                         attrName.c_str(), p->attrValue.attrValue.val.x.size - 
1);

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to