Преглед изворни кода

Fix for bug 773. Not quite the full fix, but the best we can do
for now.



git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@776 fd59a12c-fef9-0310-b244-a6a79926bd2f

Mark Haverkamp пре 20 година
родитељ
комит
e772a502ef
2 измењених фајлова са 21 додато и 9 уклоњено
  1. 13 3
      lib/evt.c
  2. 8 6
      test/testevt.c

+ 13 - 3
lib/evt.c

@@ -1631,11 +1631,11 @@ saEvtEventDataGet(
 	void *eventData, 
 	SaSizeT *eventDataSize)
 {
-	SaAisErrorT error = SA_AIS_OK;
+	SaAisErrorT error = SA_AIS_ERR_INVALID_PARAM;
 	struct event_data_instance *edi;
 	SaSizeT xfsize;
 
-	if (!eventData || !eventDataSize) {
+	if (!eventDataSize) {
 		goto data_get_done;
 	}
 
@@ -1646,6 +1646,16 @@ saEvtEventDataGet(
 	}
 	pthread_mutex_lock(&edi->edi_mutex);
 
+	/*
+	 * If no buffer was supplied, then just tell the caller
+	 * how large a buffer is needed.  
+	 */
+	if (!eventData) {
+		error = SA_AIS_ERR_NO_SPACE;
+		*eventDataSize = edi->edi_event_data_size;
+		goto unlock_put;
+	}
+
 	/*
 	 * Can't get data from an event that wasn't 
 	 * a delivered event.
@@ -1657,10 +1667,10 @@ saEvtEventDataGet(
 
 	if (edi->edi_event_data && edi->edi_event_data_size) {
 		xfsize = min(*eventDataSize, edi->edi_event_data_size);
-		*eventDataSize = edi->edi_event_data_size;
 		if (*eventDataSize < edi->edi_event_data_size) {
 			error = SA_AIS_ERR_NO_SPACE;
 		}
+		*eventDataSize = edi->edi_event_data_size;
 		memcpy(eventData, edi->edi_event_data, xfsize);
 	} else {
 		*eventDataSize = 0;

+ 8 - 6
test/testevt.c

@@ -724,7 +724,7 @@ SaEvtEventIdT event_id = 0;
 SaUint8T priority;
 SaTimeT retention_time = 0ULL;
 SaNameT publisher_name = {0, {0}};
-SaSizeT event_data_size;
+SaSizeT event_data_size = 0;
 int expected_pat_count;
 
 /*
@@ -1090,19 +1090,20 @@ test_event()
 	/*
 	 * event user data
 	 */
+	event_data_size = 0;
 	printf("       Get event data(1)\n");
 	do {
-		result = saEvtEventDataGet(event_handle, 0, 0);
+		result = saEvtEventDataGet(event_handle, 0, &event_data_size);
 	} while ((result == SA_AIS_ERR_TRY_AGAIN) && !sleep(TRY_WAIT));
-	if (result != SA_AIS_OK) {
+	if (result != SA_AIS_ERR_NO_SPACE) {
 		get_sa_error(result, result_buf, result_buf_len);
 		printf("ERROR: Get event data(1) result: %s\n", result_buf);
 	}
 	printf("       Get event data(2)\n");
 	do {
-		result = saEvtEventDataGet(event_handle, event_data, 0);
+		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(2) result: %s\n", result_buf);
 	}
@@ -1111,7 +1112,7 @@ test_event()
 	do {
 		result = saEvtEventDataGet(event_handle, 0, &event_data_size);
 	} while ((result == SA_AIS_ERR_TRY_AGAIN) && !sleep(TRY_WAIT));
-	if (result != SA_AIS_OK) {
+	if (result != SA_AIS_ERR_NO_SPACE) {
 		get_sa_error(result, result_buf, result_buf_len);
 		printf("ERROR: Get event data(3) result: %s\n", result_buf);
 	}
@@ -1151,6 +1152,7 @@ test_event()
 
 	printf("       Publish with no patterns set\n");
 
+	event_data_size = 0;
 	do {
 		result = saEvtEventSubscribe(channel_handle,
 			&subscribe_filters,