| Index: src/tcs/tcs_evlog_imaem.c
|
| diff --git a/src/tcs/tcs_evlog_imaem.c b/src/tcs/tcs_evlog_imaem.c
|
| index b617d571955d58bdf113fedee5a091101ee7457d..fbdd29aae8215813096c3ed398ee84f33f538c59 100644
|
| --- a/src/tcs/tcs_evlog_imaem.c
|
| +++ b/src/tcs/tcs_evlog_imaem.c
|
| @@ -83,11 +83,9 @@ ima_get_entries_by_pcr(FILE *handle, UINT32 pcr_index, UINT32 first,
|
| struct event_wrapper *list = calloc(1, sizeof(struct event_wrapper));
|
| struct event_wrapper *cur = list;
|
| TSS_RESULT result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| -
|
| -/* Changes for kernel IMA */
|
| -FILE *fp = (FILE *) handle;
|
| -int len;
|
| -char name[255];
|
| + FILE *fp = (FILE *) handle;
|
| + uint len;
|
| + char name[255];
|
|
|
| if (list == NULL) {
|
| LogError("malloc of %zd bytes failed.", sizeof(struct event_wrapper));
|
| @@ -129,14 +127,30 @@ char name[255];
|
| {
|
| char digest[20];
|
|
|
| - fread(&len, sizeof len, 1, fp);
|
| + if (fread(&len, 1, sizeof(len), fp) != (sizeof(len))) {
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto free_list;
|
| + }
|
| +
|
| memset(name, 0, sizeof name);
|
| - fread(name, len, 1, fp);
|
| -
|
| - fread(digest, sizeof digest, 1, fp);
|
| + if (fread(name, 1, len, fp) != len) {
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto free_list;
|
| + }
|
| + if (fread(digest, 1, sizeof digest, fp) != (sizeof(digest))) {
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto free_list;
|
| + }
|
| }
|
| /* Get the template data namelen and data */
|
| - fread(&cur->event.ulEventLength, sizeof(int), 1, fp);
|
| + if (fread(&cur->event.ulEventLength, 1, sizeof(int), fp) != sizeof(int)) {
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto free_list;
|
| + }
|
| cur->event.rgbEvent = malloc(cur->event.ulEventLength + 1);
|
| if (cur->event.rgbEvent == NULL) {
|
| free(cur->event.rgbPcrValue);
|
| @@ -146,7 +160,12 @@ char name[255];
|
| goto free_list;
|
| }
|
| memset(cur->event.rgbEvent, 0, cur->event.ulEventLength);
|
| - fread(cur->event.rgbEvent, cur->event.ulEventLength, 1, fp);
|
| + if (fread(cur->event.rgbEvent, 1, cur->event.ulEventLength, fp) != cur->event.ulEventLength) {
|
| + free(cur->event.rgbPcrValue);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto free_list;
|
| + }
|
|
|
| copied_events++;
|
| printf("%d %s ", copied_events, name);
|
| @@ -206,15 +225,14 @@ free_list:
|
| TSS_RESULT
|
| ima_get_entry(FILE *handle, UINT32 pcr_index, UINT32 *num, TSS_PCR_EVENT **ppEvent)
|
| {
|
| - int pcr_value, ptr = 0, len;
|
| + int pcr_value, ptr = 0;
|
| + uint len;
|
| char page[IMA_READ_SIZE];
|
| UINT32 seen_indices = 0;
|
| TSS_RESULT result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| - TSS_PCR_EVENT *event;
|
| + TSS_PCR_EVENT *event = NULL;
|
| FILE *fp = (FILE *) handle;
|
| char name[255];
|
| -printf("ima_get_entry \n");
|
| -fflush(stdout);
|
|
|
| rewind(fp);
|
| while (fread(page, 24, 1, fp)) {
|
| @@ -222,8 +240,6 @@ fflush(stdout);
|
| ptr = 0;
|
| memcpy(&pcr_value, &page[ptr], sizeof(int));
|
|
|
| -printf("pcr_index %u\n", (UINT32)pcr_value);
|
| -fflush(stdout);
|
| if (pcr_index == (UINT32)pcr_value) {
|
| event = calloc(1, sizeof(TSS_PCR_EVENT));
|
| event->ulPcrIndex = pcr_value;
|
| @@ -237,6 +253,7 @@ fflush(stdout);
|
| event->rgbPcrValue = malloc(event->ulPcrValueLength);
|
| if (event->rgbPcrValue == NULL) {
|
| LogError("malloc of %d bytes failed.", 20);
|
| + free(event);
|
| result = TCSERR(TSS_E_OUTOFMEMORY);
|
| goto done;
|
| }
|
| @@ -249,39 +266,76 @@ fflush(stdout);
|
| {
|
| char digest[20];
|
|
|
| - fread(&len, sizeof len, 1, fp);
|
| + if (fread(&len, 1, sizeof(len), fp) != sizeof(len)) {
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| memset(name, 0, sizeof name);
|
| - fread(name, len, 1, fp);
|
| - fread(digest, sizeof digest, 1, fp);
|
| + if (fread(name, 1, len, fp) != len) {
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| + if (fread(digest, 1, sizeof(digest), fp) != sizeof(digest)) {
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| }
|
| /* Get the template data namelen and data */
|
| - fread(&event->ulEventLength, sizeof(int), 1, fp);
|
| + if (fread(&event->ulEventLength, 1, sizeof(int), fp) != sizeof(int)) {
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| event->rgbEvent = malloc(event->ulEventLength + 1);
|
| if (event->rgbEvent == NULL) {
|
| free(event->rgbPcrValue);
|
| + free(event);
|
| LogError("malloc of %u bytes failed.",
|
| event->ulEventLength);
|
| result = TCSERR(TSS_E_OUTOFMEMORY);
|
| - free(event->rgbPcrValue);
|
| - event->rgbPcrValue = NULL;
|
| goto done;
|
| }
|
| memset(event->rgbEvent, 0, event->ulEventLength);
|
| - fread(event->rgbEvent, event->ulEventLength, 1, fp);
|
| + if (fread(event->rgbEvent, 1, event->ulEventLength, fp) != event->ulEventLength ) {
|
| + free(event->rgbPcrValue);
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| +
|
| *ppEvent = event;
|
| result = TSS_SUCCESS;
|
| break;
|
| }
|
| }
|
| - fread(&len, sizeof len, 1, fp);
|
| + if (fread(&len, 1, sizeof(len), fp) != sizeof(len)) {
|
| + free(event->rgbPcrValue);
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| fseek(fp, len + 20, SEEK_CUR);
|
| - fread(&len, sizeof len, 1, fp);
|
| + if (fread(&len, 1, sizeof(len), fp) != sizeof(len)) {
|
| + free(event->rgbPcrValue);
|
| + free(event);
|
| + LogError("Failed to read event log file");
|
| + result = TCSERR(TSS_E_INTERNAL_ERROR);
|
| + goto done;
|
| + }
|
| fseek(fp, len, SEEK_CUR);
|
| seen_indices++;
|
| printf("%d - index\n", seen_indices);
|
| }
|
| done:
|
| -fflush(stdout);
|
| if (ppEvent == NULL)
|
| *num = seen_indices;
|
|
|
|
|