Hi, Could you point out the endianness problem that is mentioned in the review request Thanks, Mathi.
----- minh.c...@dektech.com.au wrote: > 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel