diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2015-11-23 22:32:09 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2015-11-23 22:32:48 -0500 |
commit | bad6f964318ecfa6e7a0e3dc0f09773656f6a2b4 (patch) | |
tree | 96bbf14ddce1d2d2618f69a7c3cda9c9aa9939ad | |
parent | 12575330e5f6182909a9c6a692796b391857b03a (diff) | |
download | seabios-hppa-bad6f964318ecfa6e7a0e3dc0f09773656f6a2b4.zip seabios-hppa-bad6f964318ecfa6e7a0e3dc0f09773656f6a2b4.tar.gz seabios-hppa-bad6f964318ecfa6e7a0e3dc0f09773656f6a2b4.tar.bz2 |
tpm: pcpes->event is a variable length array
The event field can be of an arbitrary length.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r-- | src/std/tcg.h | 2 | ||||
-rw-r--r-- | src/tcgbios.c | 24 |
2 files changed, 12 insertions, 14 deletions
diff --git a/src/std/tcg.h b/src/std/tcg.h index 88b2688..5f9cad9 100644 --- a/src/std/tcg.h +++ b/src/std/tcg.h @@ -207,7 +207,7 @@ struct pcpes u32 eventtype; u8 digest[SHA1_BUFSIZE]; u32 eventdatasize; - u32 event; + u8 event[0]; } PACKED; struct pcctes diff --git a/src/tcgbios.c b/src/tcgbios.c index c6782ee..667bfca 100644 --- a/src/tcgbios.c +++ b/src/tcgbios.c @@ -292,7 +292,7 @@ reset_acpi_log(void) */ static u32 tpm_extend_acpi_log(struct pcpes *pcpes, - const char *event, u32 event_length, + const void *event, u32 event_length, u16 *entry_count) { u32 size; @@ -303,7 +303,7 @@ tpm_extend_acpi_log(struct pcpes *pcpes, if (tpm_state.log_area_next_entry == NULL) return TCG_PC_LOGOVERFLOW; - size = offsetof(struct pcpes, event) + event_length; + size = sizeof(*pcpes) + event_length; if ((tpm_state.log_area_next_entry + size - tpm_state.log_area_start_address) > tpm_state.log_area_minimum_length) { @@ -313,8 +313,8 @@ tpm_extend_acpi_log(struct pcpes *pcpes, pcpes->eventdatasize = event_length; - memcpy(tpm_state.log_area_next_entry, pcpes, offsetof(struct pcpes, event)); - memcpy(tpm_state.log_area_next_entry + offsetof(struct pcpes, event), + memcpy(tpm_state.log_area_next_entry, pcpes, sizeof(*pcpes)); + memcpy(tpm_state.log_area_next_entry + sizeof(*pcpes), event, event_length); tpm_state.log_area_last_entry = tpm_state.log_area_next_entry; @@ -520,7 +520,7 @@ tpm_extend(u8 *hash, u32 pcrindex) static u32 hash_log_event(const void *hashdata, u32 hashdata_length, struct pcpes *pcpes, - const char *event, u32 event_length, + const void *event, u32 event_length, u16 *entry_count) { u32 rc = 0; @@ -546,7 +546,7 @@ hash_log_event(const void *hashdata, u32 hashdata_length, static u32 hash_log_extend_event(const void *hashdata, u32 hashdata_length, struct pcpes *pcpes, - const char *event, u32 event_length, + const void *event, u32 event_length, u32 pcrindex, u16 *entry_count) { u32 rc; @@ -996,14 +996,14 @@ hash_log_extend_event_int(const struct hleei_short *hleei_s, if (pcpes->pcrindex >= 24 || pcpes->pcrindex != pcrindex || - logdatalen != offsetof(struct pcpes, event) + pcpes->eventdatasize) { + logdatalen != sizeof(*pcpes) + pcpes->eventdatasize) { rc = TCG_INVALID_INPUT_PARA; goto err_exit; } rc = hash_log_extend_event(hleei_s->hashdataptr, hleei_s->hashdatalen, pcpes, - (char *)&pcpes->event, pcpes->eventdatasize, + pcpes->event, pcpes->eventdatasize, pcrindex, NULL); if (rc) goto err_exit; @@ -1102,14 +1102,13 @@ hash_log_event_int(const struct hlei *hlei, struct hleo *hleo) if (pcpes->pcrindex >= 24 || pcpes->pcrindex != hlei->pcrindex || pcpes->eventtype != hlei->logeventtype || - hlei->logdatalen != - offsetof(struct pcpes, event) + pcpes->eventdatasize) { + hlei->logdatalen != sizeof(*pcpes) + pcpes->eventdatasize) { rc = TCG_INVALID_INPUT_PARA; goto err_exit; } rc = hash_log_event(hlei->hashdataptr, hlei->hashdatalen, - pcpes, (char *)&pcpes->event, pcpes->eventdatasize, + pcpes, pcpes->event, pcpes->eventdatasize, &entry_count); if (rc) goto err_exit; @@ -1172,7 +1171,6 @@ compact_hash_log_extend_event_int(u8 *buffer, .pcrindex = pcrindex, .eventtype = EV_COMPACT_HASH, .eventdatasize = sizeof(info), - .event = info, }; u16 entry_count; @@ -1181,7 +1179,7 @@ compact_hash_log_extend_event_int(u8 *buffer, rc = hash_log_extend_event(buffer, length, &pcpes, - (char *)&pcpes.event, pcpes.eventdatasize, + &info, pcpes.eventdatasize, pcpes.pcrindex, &entry_count); if (rc == 0) |