Quellcode durchsuchen

Fix for bug 782. Receved events may not be modified.


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@774 fd59a12c-fef9-0310-b244-a6a79926bd2f
Mark Haverkamp vor 20 Jahren
Ursprung
Commit
cfbd699177
2 geänderte Dateien mit 24 neuen und 2 gelöschten Zeilen
  1. 22 0
      lib/evt.c
  2. 2 2
      test/testevt.c

+ 22 - 0
lib/evt.c

@@ -175,6 +175,7 @@ struct event_channel_instance {
  * 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 @@ struct event_data_instance {
 	int						edi_freeing;
 	pthread_mutex_t			edi_mutex;
 	struct handle_list		*edi_hl;
+	int 					edi_ro;
 };
 
 
@@ -482,6 +484,7 @@ static SaAisErrorT make_event(SaEvtEventHandleT *event_handle,
 	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 @@ saEvtEventAllocate(
 	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 @@ saEvtEventAttributesSet(
 	}
 	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 @@ saEvtEventDataGet(
 	}
 	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 @@ saEvtEventDataGet(
 		*eventDataSize = 0;
 	}
 
+unlock_put:
 	pthread_mutex_unlock(&edi->edi_mutex);
 	saHandleInstancePut(&event_handle_db, eventHandle);
 data_get_done:

+ 2 - 2
test/testevt.c

@@ -1121,7 +1121,7 @@ test_event()
 		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 @@ test_event()
 		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);
 	}