Hi Vu,

Ack. Have not tested.

Thanks
Lennart

> -----Original Message-----
> From: Vu Minh Nguyen <vu.m.ngu...@dektech.com.au>
> Sent: den 19 juni 2018 10:50
> To: Lennart Lund <lennart.l...@ericsson.com>; Hans Nordebäck
> <hans.nordeb...@ericsson.com>; Gary Lee <gary....@dektech.com.au>
> Cc: opensaf-devel@lists.sourceforge.net; Vu Minh Nguyen
> <vu.m.ngu...@dektech.com.au>
> Subject: [PATCH 1/1] imm: fix failure to import file containing existing long 
> dn
> object [#2874]
> 
> The original object name `state->objectName` was copied using the function
> osaf_extended_name_lend(state->objectName, &objectName).
> 
> In case of long dn object, the `objectName` contained a reference to the
> string
> which was stored in `state->objectName`, any change to `state-
> >objectName`,
> in this case it was the code line `state->objectName[DNlen] = '\0',
> would impact the backup `objectName`.
> 
> As the `objectName` had been changed unintentionally to non-existing
> object dn,
> `saImmOmAccessorGet_2` returned `SA_AIS_ERR_NOT_EXIST`
> unexpectedly.
> 
> With this fix, using C++ string to copy the `state->objectName` value.
> Extracting parent DN, and object RDN are operating on C++ string, don't
> change the original value.
> ---
>  src/imm/tools/imm_import.cc | 39 +++++++++++++++++++--------------------
>  1 file changed, 19 insertions(+), 20 deletions(-)
> 
> diff --git a/src/imm/tools/imm_import.cc b/src/imm/tools/imm_import.cc
> index 5397c67..e2bdcba 100644
> --- a/src/imm/tools/imm_import.cc
> +++ b/src/imm/tools/imm_import.cc
> @@ -182,6 +182,7 @@ static SaImmValueTypeT
> getClassAttrValueType(ParserState *, const char *,
>                                               const char *);
>  static void saveRDNAttribute(ParserState *parserState);
>  static void getDNForClass(ParserState *, const SaImmClassNameT,
> +                          const std::string&,
>                            SaImmAttrValuesT_2 *);
>  static int charsToValueHelper(SaImmAttrValueT *, SaImmValueTypeT, const
> char *,
>                                bool strictParse);
> @@ -633,7 +634,8 @@ static void createImmObject(ParserState *state) {
>    SaAisErrorT errorCode = SA_AIS_OK;
>    int i = 0;
>    size_t DNlen;
> -  SaNameT objectName;
> +  const char *parent = nullptr;
> +  std::string rdn;
>    std::list<SaImmAttrValuesT_2>::iterator it;
> 
>    TRACE_8("CREATE IMM OBJECT %s, %s", state->objectClass, state-
> >objectName);
> @@ -645,23 +647,21 @@ static void createImmObject(ParserState *state) {
> 
>    /* Set the parent name */
>    osaf_extended_name_clear(&parentName);
> -  if (state->objectName != NULL) {
> -    char *parent;
> -    osaf_extended_name_lend(state->objectName, &objectName);
> -
> +  if (state->objectName != nullptr) {
> +    rdn = std::string{state->objectName};
>      /* ',' is the delimeter */
>      /* but '\' is the escape character, used for association objects */
> -    parent = state->objectName;
> +    parent = rdn.c_str();
>      do {
>        parent = strchr(parent, ',');
>        TRACE_8("PARENT: %s", parent);
>      } while (parent && (*((++parent) - 2)) == '\\');
> 
>      if (parent && strlen(parent) <= 1) {
> -      parent = NULL;
> +      parent = nullptr;
>      }
> 
> -    if (parent != NULL) osaf_extended_name_lend(parent, &parentName);
> +    if (parent != nullptr) osaf_extended_name_lend(parent, &parentName);
>    } else {
>      LOG_ER("Empty DN for object");
>      stopParser(state);
> @@ -675,19 +675,13 @@ static void createImmObject(ParserState *state) {
> 
>    if (state->ctxt->instate == XML_PARSER_EOF) return;
> 
> -#ifdef TRACE_8
>    /* Get the length of the DN and truncate state->objectName */
>    if (!osaf_is_extended_name_empty(&parentName)) {
>      DNlen = strlen(state->objectName) -
>              (strlen(osaf_extended_name_borrow(&parentName)) + 1);
> -  } else {
> -    DNlen = strlen(state->objectName);
> +    rdn[DNlen] = '\0';
>    }
> 
> -  state->objectName[DNlen] = '\0';
> -  TRACE_8("OBJECT NAME: %s", state->objectName);
> -#endif
> -
>    if (!state->validation) {
>      /* Set the attribute values array, add space for the rdn attribute
>       * and a NULL terminator */
> @@ -717,17 +711,19 @@ static void createImmObject(ParserState *state) {
> 
>      /* Do the actual creation */
>      attrValues[i] = (SaImmAttrValuesT_2 *)calloc(1,
> sizeof(SaImmAttrValuesT_2));
> -    getDNForClass(state, className, attrValues[i]);
> +    getDNForClass(state, className, rdn, attrValues[i]);
> 
>      if (state->ctxt->instate != XML_PARSER_EOF) {
>        errorCode = immutil_saImmOmCcbObjectCreate_2(
> -          state->ccbHandle, className, &parentName,
> +          state->ccbHandle, className,
> +          (parent == nullptr) ? nullptr : &parentName,
>            (const SaImmAttrValuesT_2 **)attrValues);
>      } else {
>        goto done;
>      }
> -  } else
> +  } else {
>      attrValues = NULL;
> +  }
> 
>    if (SA_AIS_OK != errorCode) {
>      if ((errorCode == SA_AIS_ERR_NOT_EXIST) && imm_import_ccb_safe) {
> @@ -746,6 +742,7 @@ static void createImmObject(ParserState *state) {
>        SaImmAttrValuesT_2 **existing_attributes;
>        SaImmAttrValuesT_2 *attr;
>        const char *existing_className;
> +      SaNameT dn;
> 
>        LOG_IN("OBJECT %s already exist, verifying...", state->objectName);
> 
> @@ -759,7 +756,8 @@ static void createImmObject(ParserState *state) {
>          goto done;
>        }
> 
> -      errorCode = immutil_saImmOmAccessorGet_2(accessorHandle,
> &objectName,
> +      osaf_extended_name_lend(state->objectName, &dn);
> +      errorCode = immutil_saImmOmAccessorGet_2(accessorHandle, &dn,
>                                                 NULL,  // get all attributes
>                                                 &existing_attributes);
>        if (SA_AIS_OK != errorCode) {
> @@ -1149,6 +1147,7 @@ static void createImmClass(ParserState *state) {
>   * Returns an SaImmAttrValueT struct representing the DN for an object
>   */
>  static void getDNForClass(ParserState *state, const SaImmClassNameT
> className,
> +                          const std::string& rdn,
>                            SaImmAttrValuesT_2 *values) {
>    std::string classNameString;
> 
> @@ -1176,7 +1175,7 @@ static void getDNForClass(ParserState *state, const
> SaImmClassNameT className,
>    values->attrValuesNumber = 1;
> 
>    if (charsToValueHelper(values->attrValues, values->attrValueType,
> -                         state->objectName, true)) {
> +                         rdn.c_str(), true)) {
>      free(values->attrValues);
>      values->attrValues = NULL;
> 
> --
> 1.9.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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to