osaf/libs/agents/saf/ntfa/Makefile.am | 1 +
osaf/libs/agents/saf/ntfa/ntfa.h | 1 +
osaf/libs/agents/saf/ntfa/ntfa_api.c | 53 +++++++++++++++++++++++++++-------
osaf/libs/agents/saf/ntfa/ntfa_util.c | 30 +++++++++++++------
osaf/libs/saf/libSaNtf/Makefile.am | 1 +
5 files changed, 65 insertions(+), 21 deletions(-)
(1) Fix longdn deallocation followed by Agent(or client) memory owner
(2) Support SA_NTF_VALUE_LDAP_NAME in AdditionalInfo
diff --git a/osaf/libs/agents/saf/ntfa/Makefile.am
b/osaf/libs/agents/saf/ntfa/Makefile.am
--- a/osaf/libs/agents/saf/ntfa/Makefile.am
+++ b/osaf/libs/agents/saf/ntfa/Makefile.am
@@ -25,6 +25,7 @@ noinst_HEADERS = \
noinst_LTLIBRARIES = libntfa.la
libntfa_la_CPPFLAGS = \
+ -DSA_EXTENDED_NAME_SOURCE \
$(AM_CPPFLAGS) \
-I$(top_srcdir)/osaf/libs/common/ntfsv/include
diff --git a/osaf/libs/agents/saf/ntfa/ntfa.h b/osaf/libs/agents/saf/ntfa/ntfa.h
--- a/osaf/libs/agents/saf/ntfa/ntfa.h
+++ b/osaf/libs/agents/saf/ntfa/ntfa.h
@@ -61,6 +61,7 @@ typedef struct ntfa_notification_hdl_rec
struct ntfa_client_hdl_rec *parent_hdl; /* Back Pointer to the client
instantiation */
SaNtfNotificationsT *cbk_notification;
v_data variable_data;
+ bool is_longdn_agent_owner;
} ntfa_notification_hdl_rec_t;
/*
diff --git a/osaf/libs/agents/saf/ntfa/ntfa_api.c
b/osaf/libs/agents/saf/ntfa/ntfa_api.c
--- a/osaf/libs/agents/saf/ntfa/ntfa_api.c
+++ b/osaf/libs/agents/saf/ntfa/ntfa_api.c
@@ -18,7 +18,8 @@
#include <string.h>
#include "ntfa.h"
#include "ntfsv_mem.h"
-
+#include "osaf_extended_name.h"
+#include "saAis.h"
#define NCS_SAF_MIN_ACCEPT_TIME 10
#define NTFS_WAIT_TIME 1000
@@ -305,8 +306,9 @@ static SaAisErrorT checkHeader(SaNtfNoti
{
int i =0;
- if (nh->notificationObject->length >= SA_MAX_NAME_LENGTH ||
nh->notifyingObject->length >= SA_MAX_NAME_LENGTH) {
- TRACE_1("SaNameT length too big");
+ if (!ntfsv_sanamet_is_valid(nh->notificationObject) ||
+ !ntfsv_sanamet_is_valid(nh->notifyingObject)) {
+ TRACE_1("SaNameT is invaild");
return SA_AIS_ERR_INVALID_PARAM;
}
@@ -517,12 +519,13 @@ static SaAisErrorT fillSendStruct(SaNtfN
/* nodificationId set to zero means that this is a new notification */
/* and not an sync message send from the server. */
*(notificationHeader->notificationId) = 0;
+
+ /* If notifyingObject is empty, its default value is notificationObject
*/
+ if (osaf_is_extended_name_empty(notificationHeader->notifyingObject)) {
+
osaf_extended_name_lend(osaf_extended_name_borrow(notificationHeader->notificationObject)
+ ,
notificationHeader->notifyingObject);
+ }
- if (notificationHeader->notifyingObject->length == 0) {
- notificationHeader->notifyingObject->length =
notificationHeader->notificationObject->length;
- (void)memcpy(notificationHeader->notifyingObject->value,
notificationHeader->notificationObject->value,
- notificationHeader->notifyingObject->length);
- }
return rc;
}
@@ -1204,7 +1207,7 @@ SaAisErrorT saNtfNotificationSend(SaNtfN
rc = SA_AIS_ERR_BAD_HANDLE;
goto err_free;
}
-
+ notification_hdl_rec->is_longdn_agent_owner = false;
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
client_handle = notification_hdl_rec->parent_hdl->local_hdl;
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -1288,6 +1291,32 @@ SaAisErrorT saNtfNotificationSend(SaNtfN
goto done_give_hdls;
}
send_param->variable_data = notification_hdl_rec->variable_data;
+ SaUint16T i = 0;
+ for(i=0 ; i < ntfHeader->numAdditionalInfo ; i++ ) {
+ if (ntfHeader->additionalInfo[i].infoType ==
SA_NTF_VALUE_LDAP_NAME) {
+ SaNameT *ptr = send_param->variable_data.p_base +
+
ntfHeader->additionalInfo[i].infoValue.ptrVal.dataOffset;
+ if (!ntfsv_sanamet_is_valid(ptr)) {
+ rc = SA_AIS_ERR_INVALID_PARAM;
+ goto done_give_hdls;
+ }
+ if (osaf_is_an_extended_name(ptr)) {
+ size_t length_to_copy;
+ void *p;
+ if
(ntfHeader->additionalInfo[i].infoValue.ptrVal.dataSize
+ <
(osaf_extended_name_length(ptr) + 2)) {
+ LOG_ER("The allocated memory is not
large enough,"
+ " the object will be
truncated (%s)"
+ ,
osaf_extended_name_borrow(ptr));
+ length_to_copy =
ntfHeader->additionalInfo[i].infoValue.ptrVal.dataSize - 2;
+ } else
+ length_to_copy =
osaf_extended_name_length(ptr);
+ p = send_param->variable_data.p_base +
+
ntfHeader->additionalInfo[i].infoValue.ptrVal.dataOffset + 2;
+ memcpy(p, osaf_extended_name_borrow(ptr),
length_to_copy);
+ }
+ }
+ }
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
/* Send a sync MDS message to obtain a notification id */
mds_rc = ntfa_mds_msg_sync_send(&ntfa_cb, &msg, &o_msg, timeout);
@@ -2267,7 +2296,7 @@ SaAisErrorT saNtfStateChangeNotification
rc = SA_AIS_ERR_LIBRARY;
}
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
- ntfsv_filter_state_ch_free(new_filter);
+ ntfsv_filter_state_ch_free(new_filter, false);
TRACE("ERROR, rc = %d!!!", rc);
goto done_give_hdl;
}
@@ -2349,7 +2378,7 @@ SaAisErrorT saNtfAlarmNotificationFilter
rc = SA_AIS_ERR_LIBRARY;
}
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
- ntfsv_filter_alarm_free(new_filter);
+ ntfsv_filter_alarm_free(new_filter, false);
TRACE("ERROR, rc = %d!!!", rc);
goto done_give_hdl;
}
@@ -2927,6 +2956,7 @@ SaAisErrorT saNtfNotificationReadNext(Sa
rc = SA_AIS_ERR_BAD_HANDLE;
goto done_give_hdls;
}
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc = ntfsv_v_data_cp(¬ification_hdl_rec->variable_data,
&read_not->variable_data);
ncshm_give_hdl(notification->notification.alarmNotification.notificationHandle);
ntfsv_copy_ntf_alarm(¬ification->notification.alarmNotification,
&read_not->notification.alarm);
@@ -2960,6 +2990,7 @@ SaAisErrorT saNtfNotificationReadNext(Sa
rc = SA_AIS_ERR_BAD_HANDLE;
goto done_give_hdls;
}
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc = ntfsv_v_data_cp(¬ification_hdl_rec->variable_data,
&read_not->variable_data);
ncshm_give_hdl(notification->notification.securityAlarmNotification.notificationHandle);
ntfsv_copy_ntf_security_alarm(¬ification->notification.securityAlarmNotification,
diff --git a/osaf/libs/agents/saf/ntfa/ntfa_util.c
b/osaf/libs/agents/saf/ntfa/ntfa_util.c
--- a/osaf/libs/agents/saf/ntfa/ntfa_util.c
+++ b/osaf/libs/agents/saf/ntfa/ntfa_util.c
@@ -165,6 +165,7 @@ static SaAisErrorT ntfa_alloc_callback_n
}
/* to be able to delelte cbk_notification in
saNtfNotificationFree */
notification_hdl_rec->cbk_notification = notification;
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc =
ntfsv_v_data_cp(¬ification_hdl_rec->variable_data, ¬_cbk->variable_data);
ncshm_give_hdl(notification->notification.objectCreateDeleteNotification.notificationHandle);
ntfsv_copy_ntf_obj_cr_del(¬ification->notification.objectCreateDeleteNotification,
@@ -197,6 +198,7 @@ static SaAisErrorT ntfa_alloc_callback_n
}
/* to be able to delelte cbk_notification in
saNtfNotificationFree */
notification_hdl_rec->cbk_notification = notification;
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc =
ntfsv_v_data_cp(¬ification_hdl_rec->variable_data, ¬_cbk->variable_data);
ncshm_give_hdl(notification->notification.attributeChangeNotification.notificationHandle);
ntfsv_copy_ntf_attr_change(¬ification->notification.attributeChangeNotification,
@@ -229,6 +231,7 @@ static SaAisErrorT ntfa_alloc_callback_n
}
/* to be able to delelte cbk_notification in
saNtfNotificationFree */
notification_hdl_rec->cbk_notification = notification;
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc =
ntfsv_v_data_cp(¬ification_hdl_rec->variable_data, ¬_cbk->variable_data);
ncshm_give_hdl(notification->notification.stateChangeNotification.notificationHandle);
ntfsv_copy_ntf_state_change(¬ification->notification.stateChangeNotification,
@@ -260,6 +263,7 @@ static SaAisErrorT ntfa_alloc_callback_n
}
/* to be able to delelte cbk_notification in
saNtfNotificationFree */
notification_hdl_rec->cbk_notification = notification;
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc =
ntfsv_v_data_cp(¬ification_hdl_rec->variable_data, ¬_cbk->variable_data);
ncshm_give_hdl(notification->notification.alarmNotification.notificationHandle);
ntfsv_copy_ntf_alarm(¬ification->notification.alarmNotification,
@@ -290,6 +294,7 @@ static SaAisErrorT ntfa_alloc_callback_n
}
/* to be able to delelte cbk_notification in
saNtfNotificationFree */
notification_hdl_rec->cbk_notification = notification;
+ notification_hdl_rec->is_longdn_agent_owner = true;
rc =
ntfsv_v_data_cp(¬ification_hdl_rec->variable_data, ¬_cbk->variable_data);
ncshm_give_hdl(notification->notification.securityAlarmNotification.notificationHandle);
ntfsv_copy_ntf_security_alarm(¬ification->notification.securityAlarmNotification,
@@ -1027,24 +1032,29 @@ void ntfa_hdl_rec_destructor(ntfa_notifi
switch (notificationInstance->ntfNotificationType) {
case SA_NTF_TYPE_ALARM:
-
ntfsv_free_alarm(¬ificationInstance->ntfNotification.ntfAlarmNotification);
+
ntfsv_free_alarm(¬ificationInstance->ntfNotification.ntfAlarmNotification
+ ,
notificationInstance->is_longdn_agent_owner);
break;
case SA_NTF_TYPE_STATE_CHANGE:
-
ntfsv_free_state_change(¬ificationInstance->ntfNotification.ntfStateChangeNotification);
+
ntfsv_free_state_change(¬ificationInstance->ntfNotification.ntfStateChangeNotification
+ ,
notificationInstance->is_longdn_agent_owner);
break;
case SA_NTF_TYPE_OBJECT_CREATE_DELETE:
-
ntfsv_free_obj_create_del(¬ificationInstance->ntfNotification.ntfObjectCreateDeleteNotification);
+
ntfsv_free_obj_create_del(¬ificationInstance->ntfNotification.ntfObjectCreateDeleteNotification
+ ,
notificationInstance->is_longdn_agent_owner);
break;
case SA_NTF_TYPE_ATTRIBUTE_CHANGE:
-
ntfsv_free_attribute_change(¬ificationInstance->ntfNotification.ntfAttributeChangeNotification);
+
ntfsv_free_attribute_change(¬ificationInstance->ntfNotification.ntfAttributeChangeNotification
+ ,
notificationInstance->is_longdn_agent_owner);
break;
case SA_NTF_TYPE_SECURITY_ALARM:
-
ntfsv_free_security_alarm(¬ificationInstance->ntfNotification.ntfSecurityAlarmNotification);
+
ntfsv_free_security_alarm(¬ificationInstance->ntfNotification.ntfSecurityAlarmNotification
+ ,
notificationInstance->is_longdn_agent_owner);
break;
default:
@@ -1068,19 +1078,19 @@ void ntfa_filter_hdl_rec_destructor(ntfa
{
switch (filter_rec->ntfType) {
case SA_NTF_TYPE_OBJECT_CREATE_DELETE:
-
ntfsv_filter_obj_cr_del_free(&filter_rec->notificationFilter.objectCreateDeleteNotificationfilter);
+
ntfsv_filter_obj_cr_del_free(&filter_rec->notificationFilter.objectCreateDeleteNotificationfilter,
false);
break;
case SA_NTF_TYPE_ATTRIBUTE_CHANGE:
-
ntfsv_filter_attr_ch_free(&filter_rec->notificationFilter.attributeChangeNotificationfilter);
+
ntfsv_filter_attr_ch_free(&filter_rec->notificationFilter.attributeChangeNotificationfilter,
false);
break;
case SA_NTF_TYPE_STATE_CHANGE:
-
ntfsv_filter_state_ch_free(&filter_rec->notificationFilter.stateChangeNotificationfilter);
+
ntfsv_filter_state_ch_free(&filter_rec->notificationFilter.stateChangeNotificationfilter,
false);
break;
case SA_NTF_TYPE_SECURITY_ALARM:
-
ntfsv_filter_sec_alarm_free(&filter_rec->notificationFilter.securityAlarmNotificationfilter);
+
ntfsv_filter_sec_alarm_free(&filter_rec->notificationFilter.securityAlarmNotificationfilter,
false);
break;
case SA_NTF_TYPE_ALARM:
-
ntfsv_filter_alarm_free(&filter_rec->notificationFilter.alarmNotificationfilter);
+
ntfsv_filter_alarm_free(&filter_rec->notificationFilter.alarmNotificationfilter,
false);
break;
default:
osafassert(0);
diff --git a/osaf/libs/saf/libSaNtf/Makefile.am
b/osaf/libs/saf/libSaNtf/Makefile.am
--- a/osaf/libs/saf/libSaNtf/Makefile.am
+++ b/osaf/libs/saf/libSaNtf/Makefile.am
@@ -29,6 +29,7 @@ lib_LTLIBRARIES = libSaNtf.la
libSaNtf_la_SOURCES =
libSaNtf_la_CPPFLAGS = \
+ -DSA_EXTENDED_NAME_SOURCE \
$(AM_CPPFLAGS)
if HAVE_LD_VERSION_SCRIPT
------------------------------------------------------------------------------
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