aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2015-11-23 22:32:09 -0500
committerKevin O'Connor <kevin@koconnor.net>2015-11-23 22:32:48 -0500
commitbad6f964318ecfa6e7a0e3dc0f09773656f6a2b4 (patch)
tree96bbf14ddce1d2d2618f69a7c3cda9c9aa9939ad
parent12575330e5f6182909a9c6a692796b391857b03a (diff)
downloadseabios-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.h2
-rw-r--r--src/tcgbios.c24
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)