[Openais] Fix for bug 782

Mark Haverkamp markh at osdl.org
Tue Jul 26 12:09:54 PDT 2005


On Tue, 2005-07-26 at 11:54 -0700, Steven Dake wrote:
> Mark
> 
> I'm a little confused by why this patch returns SA_AIS_ERR_BAD_HANDLE.
> 
> The spec says that is only for bad handle objects, which is not the case
> that is tested for in the patch.

Here is what I am using from page 46 line 7:

"SA_AIS_ERR_BAD_HANDLE - The handle eventHandle is invalid, due to one
or more of the reasons below:
• It is corrupted, 
>> was not obtained via the saEvtEventDeliverCallback() function <<

, or saEvtEventFree() has already been invoked for eventHandle.
• The corresponding event channel has already been closed.
• The handle evtHandle that was passed to the saEvtChannelOpen() or
saEvtChannelOpenAsync() functions has already been finalized."


> 
> regards
> -steve
> 
> On Tue, 2005-07-26 at 09:58 -0700, Mark Haverkamp wrote:
> > 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);
> >  	}
> > 
> > _______________________________________________
> > Openais mailing list
> > Openais at lists.osdl.org
> > https://lists.osdl.org/mailman/listinfo/openais
-- 
Mark Haverkamp <markh at osdl.org>




More information about the Openais mailing list