Hi Hung,

Reviewed the patch.
Ack from me.

In README.NO_DANGLING it's written:
"This flag can only be set for attribute definitions where the attribute data
type is SaNameT and the attribute is a CONFIG attribute."

... but later....

"The value must of course be the DN of a currently existing object. The use
of SaStringT is allowed here to accommodate future enhancements that
replace the use of SaNameT with SaStringT."

Maybe we need another ticket to clearly state that NO_DANGLING flag works with 
SaNameT type or SaStringT type with SA_IMM_ATTR_DN flag.

Thanks,
Zoran

-----Original Message-----
From: Hung Nguyen [mailto:[email protected]] 
Sent: den 23 januari 2017 08:54
To: Zoran Milinkovic <[email protected]>; 
[email protected]
Cc: [email protected]
Subject: [PATCH 1 of 1] imm: Add missing checks for SaStringT attributes with 
ATTR_DN flag [#2270]

 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