osaf/libs/common/ntfsv/Makefile.am         |    1 +
 osaf/libs/common/ntfsv/include/ntfsv_mem.h |    7 +
 osaf/libs/common/ntfsv/ntfsv_enc_dec.c     |   37 ++++--
 osaf/libs/common/ntfsv/ntfsv_mem.c         |  151 +++++++++++++++++++++++++++-
 4 files changed, 175 insertions(+), 21 deletions(-)


(1)Fix endian issue in ntfs_sanamet_length,
ntfsv_sanamet_alloc, ntfsv_sanamet_steal

diff --git a/osaf/libs/common/ntfsv/Makefile.am 
b/osaf/libs/common/ntfsv/Makefile.am
--- a/osaf/libs/common/ntfsv/Makefile.am
+++ b/osaf/libs/common/ntfsv/Makefile.am
@@ -23,6 +23,7 @@ SUBDIRS = include
 noinst_LTLIBRARIES = libntfsv_common.la
 
 libntfsv_common_la_CPPFLAGS = \
+       -DSA_EXTENDED_NAME_SOURCE \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir)/osaf/libs/common/ntfsv/include
 
diff --git a/osaf/libs/common/ntfsv/include/ntfsv_mem.h 
b/osaf/libs/common/ntfsv/include/ntfsv_mem.h
--- a/osaf/libs/common/ntfsv/include/ntfsv_mem.h
+++ b/osaf/libs/common/ntfsv/include/ntfsv_mem.h
@@ -97,6 +97,13 @@ extern "C" {
        void 
ntfsv_filter_obj_cr_del_free(SaNtfObjectCreateDeleteNotificationFilterT *f);
        void ntfsv_filter_attr_ch_free(SaNtfAttributeChangeNotificationFilterT 
*f);
 
+       SaAisErrorT ntfsv_sanamet_copy(SaNameT* pDes, SaNameT* pSrc);
+       bool ntfsv_sanamet_is_valid(const SaNameT* pName);
+       void ntfsv_sanamet_clone_strptr(SaNameT* pName);
+       SaStringT ntfs_sanamet_strdup(SaNameT* pName);
+       size_t ntfs_sanamet_length(const SaNameT* pName);
+       void ntfs_sanamet_steal(SaStringT value, size_t length, SaNameT* pName);
+       void ntfs_sanamet_alloc(SaConstStringT value, size_t length, SaNameT* 
pName);
 #ifdef  __cplusplus
 }
 #endif
diff --git a/osaf/libs/common/ntfsv/ntfsv_enc_dec.c 
b/osaf/libs/common/ntfsv/ntfsv_enc_dec.c
--- a/osaf/libs/common/ntfsv/ntfsv_enc_dec.c
+++ b/osaf/libs/common/ntfsv/ntfsv_enc_dec.c
@@ -18,6 +18,8 @@
 #include <ncsencdec_pub.h>
 #include "ntfsv_enc_dec.h"
 #include "ntfsv_mem.h"
+#include "osaf_extended_name.h"
+#include "saAis.h"
 
 typedef union {
        uint32_t uint32_val;
@@ -334,19 +336,22 @@ static uint32_t decodeSaNtfAttribute(NCS
 static uint32_t encodeSaNameT(NCS_UBAID *uba, uint8_t *p8, SaNameT *name)
 {
        uint32_t rv;
-       
        p8 = ncs_enc_reserve_space(uba, 2);
        if (!p8) {
                TRACE("ncs_enc_reserve_space failed");
                return NCSCC_RC_OUT_OF_MEM;
        }
-       if (name->length > SA_MAX_NAME_LENGTH) {
-               LOG_ER("SaNameT length too long %hd", name->length);
-               osafassert(0);
-       }
-       ncs_encode_16bit(&p8, name->length);
-       ncs_enc_claim_space(uba, 2);
-       rv = ncs_encode_n_octets_in_uba(uba, name->value, 
(uint32_t)name->length);
+
+       if (!ntfsv_sanamet_is_valid(name)) {
+               LOG_ER("SaNameT is invalid");
+               osafassert(0);
+       }
+
+       SaConstStringT value = osaf_extended_name_borrow(name);
+       size_t length = ntfs_sanamet_length(name);
+       ncs_encode_16bit(&p8, length);
+       ncs_enc_claim_space(uba, 2);
+       rv = ncs_encode_n_octets_in_uba(uba, (uint8_t*) value, (uint32_t) 
length);
        return rv;
 }
 
@@ -355,14 +360,22 @@ static uint32_t decodeSaNameT(NCS_UBAID 
        uint8_t local_data[2];
        uint32_t rv;
        p8 = ncs_dec_flatten_space(uba, local_data, 2);
-       name->length = ncs_decode_16bit(&p8);
-       if (name->length > SA_MAX_NAME_LENGTH) {
-               LOG_ER("SaNameT length too long: %hd", name->length);
+       size_t length = ncs_decode_16bit(&p8);
+       if (length > kMaxDnLength) {
+               LOG_ER("SaNameT length too long: %zu", length);
                /* this should not happen */
                osafassert(0);
        }
        ncs_dec_skip_space(uba, 2);
-       rv = ncs_decode_n_octets_from_uba(uba, name->value, 
(uint32_t)name->length);
+       char* value = (char*) malloc(length + 1);
+       if (value == NULL) {
+               LOG_ER("Out of memory");
+               /* this should not happen */
+               osafassert(0);
+       }
+       rv = ncs_decode_n_octets_from_uba(uba, (uint8_t*) value, (uint32_t) 
length);
+       value[length] = '\0';
+       ntfs_sanamet_steal(value, length, name);
        return rv;
 }
 
diff --git a/osaf/libs/common/ntfsv/ntfsv_mem.c 
b/osaf/libs/common/ntfsv/ntfsv_mem.c
--- a/osaf/libs/common/ntfsv/ntfsv_mem.c
+++ b/osaf/libs/common/ntfsv/ntfsv_mem.c
@@ -18,6 +18,8 @@
 #include <saNtf.h>
 #include <stdlib.h>
 #include "ntfsv_mem.h"
+#include "osaf_extended_name.h"
+#include "saAis.h"
 #include <logtrace.h>
 
 void ntfsv_free_header(const SaNtfNotificationHeaderT *notificationHeader)
@@ -27,10 +29,14 @@ void ntfsv_free_header(const SaNtfNotifi
                free(notificationHeader->eventType);
        if (notificationHeader->eventTime != NULL)
                free(notificationHeader->eventTime);
-       if (notificationHeader->notificationObject != NULL)
+       if (notificationHeader->notificationObject != NULL) {
+               
osaf_extended_name_free(notificationHeader->notificationObject); 
                free(notificationHeader->notificationObject);
-       if (notificationHeader->notifyingObject != NULL)
+       }
+       if (notificationHeader->notifyingObject != NULL) {
+               osaf_extended_name_free(notificationHeader->notifyingObject); 
                free(notificationHeader->notifyingObject);
+       }
        if (notificationHeader->notificationClassId != NULL)
                free(notificationHeader->notificationClassId);
        if (notificationHeader->notificationId != NULL)
@@ -486,10 +492,10 @@ void ntfsv_copy_ntf_header(SaNtfNotifica
        *(dest->eventTime) = *(src->eventTime);
 
        /* Set Notification Object */
-       *(dest->notificationObject) = *(src->notificationObject);
+       ntfsv_sanamet_copy(dest->notificationObject, src->notificationObject);
 
        /* Set Notifying Object */
-       *(dest->notifyingObject) = *(src->notifyingObject);
+       ntfsv_sanamet_copy(dest->notifyingObject, src->notifyingObject);
 
        /* set Notification Class Identifier */
        dest->notificationClassId->vendorId = 
src->notificationClassId->vendorId;
@@ -954,7 +960,7 @@ SaAisErrorT ntfsv_filter_header_alloc(Sa
        /* Notification objects */
        if (numNotificationObjects != 0) {
 
-               header->notificationObjects = (SaNameT 
*)malloc(numNotificationObjects * sizeof(SaNameT));
+               header->notificationObjects = (SaNameT 
*)calloc(numNotificationObjects, sizeof(SaNameT));
                if (header->notificationObjects == NULL) {
                        TRACE_1("Out of memory notificationObjects");
                        rc = SA_AIS_ERR_NO_MEMORY;
@@ -964,7 +970,7 @@ SaAisErrorT ntfsv_filter_header_alloc(Sa
 
        /* Notifying objects */
        if (numNotifyingObjects != 0) {
-               header->notifyingObjects = (SaNameT 
*)malloc(numNotifyingObjects * sizeof(SaNameT));
+               header->notifyingObjects = (SaNameT 
*)calloc(numNotifyingObjects, sizeof(SaNameT));
                if (header->notifyingObjects == NULL) {
                        TRACE_1("Out of memory notifyingObjects");
                        rc = SA_AIS_ERR_NO_MEMORY;
@@ -1175,9 +1181,9 @@ error_free:
 void ntfsv_filter_header_free(SaNtfNotificationFilterHeaderT *header)
 {
        free(header->eventTypes);
-       free(header->notificationObjects);
-       free(header->notifyingObjects);
-       free(header->notificationClassIds);
+       free(header->notificationObjects);
+       free(header->notifyingObjects);
+       free(header->notificationClassIds);
 }
 
 void ntfsv_filter_sec_alarm_free(SaNtfSecurityAlarmNotificationFilterT 
*s_filter)
@@ -1226,3 +1232,130 @@ void ntfsv_filter_attr_ch_free(SaNtfAttr
        }
 }
 
+/**
+ *  @Brief: Copy SaNameT pointed by pSrc to pDes
+ *
+ */
+SaAisErrorT ntfsv_sanamet_copy(SaNameT* pDes, SaNameT* pSrc)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       if (osaf_is_an_extended_name(pDes)) {
+               TRACE("Can not modify the existing longDn object");
+               return SA_AIS_ERR_EXIST;
+       }
+       if (osaf_is_an_extended_name(pSrc)) {
+               osaf_extended_name_alloc(osaf_extended_name_borrow(pSrc), pDes);
+       } else {
+               /* pSrc is old SaNameT format, @.length could be counted with or
+                * without null-termination, we need to preserve the @.length,
+                * just a memcpy here
+                */
+                memcpy(pDes, pSrc, sizeof(SaNameT));
+       }
+       return rc;
+}
+
+/**
+ *  @Brief: Check SaNameT is a valid formation
+ *
+ */
+bool ntfsv_sanamet_is_valid(const SaNameT* pName)
+{
+       if (!osaf_is_extended_name_valid(pName)) {
+               LOG_ER("Environment variable SA_ENABLE_EXTENDED_NAMES "
+                       "is not set, or not using extended name api");
+               return false;
+       }
+       if (osaf_extended_name_length(pName) > kMaxDnLength) {
+               LOG_ER("Exceeding maximum of extended name length(%u)"
+                       ,kMaxDnLength);
+               return false;
+       }
+       return true;
+}
+
+/**
+ *  @Brief: Clone the string pointer in extended name
+ *
+ */
+void ntfsv_sanamet_clone_strptr(SaNameT* pName)
+{
+       if (osaf_is_an_extended_name(pName))
+               osaf_extended_name_alloc(osaf_extended_name_borrow(pName), 
pName); 
+}
+
+/**
+ *  @Brief: Return the length of string specified in SaNameT type.
+ *
+ */
+size_t ntfs_sanamet_length(const SaNameT* pName)
+{
+       if (osaf_is_an_extended_name(pName))
+               return osaf_extended_name_length(pName);
+       
+       /* In case of unextended name, sometimes @.length includes the count on
+        * null-termination, and osaf_extended_name_length returns the length
+        * excluding the null-termination which less 1 than the @.length. Here
+        * we need the length specified in @.length. This case mainly applies
+        * in encodeSaNameT/decodeSaNameT in order to preserve the original
+        * @.length value
+        */
+       size_t length = *((SaUint16T*)pName);
+       osafassert(length < SA_MAX_UNEXTENDED_NAME_LENGTH);
+       return length;
+}
+
+/**
+ *  @Brief: Allocate the new null-terminated string in SaNameT type, and return
+ *                     the pointer of this new string.
+ *
+ */
+SaStringT ntfs_sanamet_strdup(SaNameT* pName)
+{
+       SaStringT pRtr;
+       SaConstStringT pStr;
+       size_t length;
+       
+       length = osaf_extended_name_length(pName) + 1;
+       pStr = osaf_extended_name_borrow(pName);
+
+       pRtr = (char*) malloc(length);
+       if (pRtr == NULL) {
+               LOG_ER("out of memory");
+               return NULL;
+       }
+       memcpy(pRtr, pStr, length);
+       pRtr[length - 1] = '\0';
+       return pRtr;
+}
+
+/**
+ *  @Brief: Create SaNameT input by string @value and @length,
+ *                     @value is not freed then
+ */
+void ntfs_sanamet_alloc(SaConstStringT value, size_t length, SaNameT* pName)
+{
+       osaf_extended_name_alloc(value, pName);
+       /* Accept the old SaNameT which's @.length counting the null 
termination */
+       if (!osaf_is_an_extended_name(pName) 
+               && ((ntfs_sanamet_length(pName)+1) == length)) {
+               *((SaUint16T*)pName) += 1;
+       }       
+}
+
+/**
+ *  @Brief: Create SaNameT input by string @value and @length,
+ *                     @value is freed then
+ */
+void ntfs_sanamet_steal(SaStringT value, size_t length, SaNameT* pName)
+{
+       /* create pName by string @value */
+       osaf_extended_name_free(pName);
+       osaf_extended_name_steal(value, pName);
+       
+       /* Accept the old SaNameT which's @.length counting the null 
termination */
+       if (!osaf_is_an_extended_name(pName) 
+               && ((ntfs_sanamet_length(pName)+1) == length)) {
+               *((SaUint16T*)pName) += 1;
+       }
+}

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to