[Openais] Fix for bug 782
Mark Haverkamp
markh at osdl.org
Tue Jul 26 09:58:20 PDT 2005
Certain events may not be modified. In particular event data received.
The B spec says on page 41 line 31:
SA_AIS_ERR_ACCESS - The access to this event is denied. In particular, a subscriber
is not allowed to modify an event delivered by the
saEvtEventDeliverCallback() callback function
This patch creates a read only flag associated with an event.
Index: openais_work/lib/evt.c
===================================================================
--- openais_work.orig/lib/evt.c 2005-07-25 09:49:46.000000000 -0700
+++ openais_work/lib/evt.c 2005-07-25 10:00:50.000000000 -0700
@@ -175,6 +175,7 @@
* edi_mutex: event data mutex
* edi_hl: pointer to channel's handle
* struct for this event.
+ * edi_ro: read only flag
*/
struct event_data_instance {
SaEvtChannelHandleT edi_channel_handle;
@@ -190,6 +191,7 @@
int edi_freeing;
pthread_mutex_t edi_mutex;
struct handle_list *edi_hl;
+ int edi_ro;
};
@@ -482,6 +484,7 @@
memset(edi, 0, sizeof(*edi));
pthread_mutex_init(&edi->edi_mutex, NULL);
+ edi->edi_ro = 1;
edi->edi_freeing = 0;
edi->edi_channel_handle = evt->led_lib_channel_handle;
edi->edi_priority = evt->led_priority;
@@ -1319,6 +1322,7 @@
memset(edi, 0, sizeof(*edi));
pthread_mutex_init(&edi->edi_mutex, NULL);
+ edi->edi_ro = 0;
edi->edi_freeing = 0;
edi->edi_channel_handle = channelHandle;
edi->edi_pub_node = evti->ei_node_id;
@@ -1412,6 +1416,14 @@
}
pthread_mutex_lock(&edi->edi_mutex);
+ /*
+ * Cannot modify an event returned via callback.
+ */
+ if (edi->edi_ro) {
+ error = SA_AIS_ERR_ACCESS;
+ goto attr_set_unlock;
+ }
+
edi->edi_priority = priority;
edi->edi_retention_time = retentionTime;
@@ -1634,6 +1646,15 @@
}
pthread_mutex_lock(&edi->edi_mutex);
+ /*
+ * Can't get data from an event that wasn't
+ * a delivered event.
+ */
+ if (!edi->edi_ro) {
+ error = SA_AIS_ERR_BAD_HANDLE;
+ goto unlock_put;
+ }
+
if (edi->edi_event_data && edi->edi_event_data_size) {
xfsize = min(*eventDataSize, edi->edi_event_data_size);
*eventDataSize = edi->edi_event_data_size;
@@ -1645,6 +1666,7 @@
*eventDataSize = 0;
}
+unlock_put:
pthread_mutex_unlock(&edi->edi_mutex);
saHandleInstancePut(&event_handle_db, eventHandle);
data_get_done:
Index: openais_work/test/testevt.c
===================================================================
--- openais_work.orig/test/testevt.c 2005-07-07 13:22:50.000000000 -0700
+++ openais_work/test/testevt.c 2005-07-07 13:28:59.000000000 -0700
@@ -1121,7 +1121,7 @@
result = saEvtEventDataGet(event_handle, event_data,
&event_data_size);
} while ((result == SA_AIS_ERR_TRY_AGAIN) && !sleep(TRY_WAIT));
- if (result != SA_AIS_OK) {
+ if (result != SA_AIS_ERR_BAD_HANDLE) {
get_sa_error(result, result_buf, result_buf_len);
printf("ERROR: Get event data(4) result: %s\n", result_buf);
}
@@ -1131,7 +1131,7 @@
result = saEvtEventDataGet(event_handle, event_data,
&event_data_size);
} while ((result == SA_AIS_ERR_TRY_AGAIN) && !sleep(TRY_WAIT));
- if (result != SA_AIS_OK) {
+ if (result != SA_AIS_ERR_BAD_HANDLE) {
get_sa_error(result, result_buf, result_buf_len);
printf("ERROR: Get event data(5) result: %s\n", result_buf);
}
--
Mark Haverkamp <markh at osdl.org>
More information about the Openais
mailing list