提交 659d95bc 编写于 作者: jia zhang's avatar jia zhang 提交者: Tianjia Zhang

tpm: Simplify the measurements loop

commit bb3b6b0fc57182b568ded61c55eff8a02fcfe27b upstream

The responsibility of tpm1_bios_measurements_start() is to walk over the
first *pos measurements, ensuring the skipped and to-be-read
measurements are not out-of-boundary.

This commit simplifies the loop by employing a do-while loop with
the necessary sanity check.
Signed-off-by: jia zhang's avatarJia Zhang <zhang.jia@linux.alibaba.com>
Reviewd-by: NJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: NJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: NTianjia Zhang <tianjia.zhang@linux.alibaba.com>
Reviewed-by: jia zhang's avatarJia Zhang <zhang.jia@linux.alibaba.com>
上级 a816f831
...@@ -74,7 +74,7 @@ static const char* tcpa_pc_event_id_strings[] = { ...@@ -74,7 +74,7 @@ static const char* tcpa_pc_event_id_strings[] = {
/* returns pointer to start of pos. entry of tcg log */ /* returns pointer to start of pos. entry of tcg log */
static void *tpm1_bios_measurements_start(struct seq_file *m, loff_t *pos) static void *tpm1_bios_measurements_start(struct seq_file *m, loff_t *pos)
{ {
loff_t i; loff_t i = 0;
struct tpm_chip *chip = m->private; struct tpm_chip *chip = m->private;
struct tpm_bios_log *log = &chip->log; struct tpm_bios_log *log = &chip->log;
void *addr = log->bios_event_log; void *addr = log->bios_event_log;
...@@ -83,38 +83,29 @@ static void *tpm1_bios_measurements_start(struct seq_file *m, loff_t *pos) ...@@ -83,38 +83,29 @@ static void *tpm1_bios_measurements_start(struct seq_file *m, loff_t *pos)
u32 converted_event_size; u32 converted_event_size;
u32 converted_event_type; u32 converted_event_type;
/* read over *pos measurements */ /* read over *pos measurements */
for (i = 0; i < *pos; i++) { do {
event = addr; event = addr;
/* check if current entry is valid */
if (addr + sizeof(struct tcpa_event) >= limit)
return NULL;
converted_event_size = converted_event_size =
do_endian_conversion(event->event_size); do_endian_conversion(event->event_size);
converted_event_type = converted_event_type =
do_endian_conversion(event->event_type); do_endian_conversion(event->event_type);
if ((addr + sizeof(struct tcpa_event)) < limit) { if (((converted_event_type == 0) && (converted_event_size == 0))
if ((converted_event_type == 0) && || ((addr + sizeof(struct tcpa_event) + converted_event_size)
(converted_event_size == 0)) >= limit))
return NULL; return NULL;
addr += (sizeof(struct tcpa_event) +
converted_event_size);
}
}
/* now check if current entry is valid */
if ((addr + sizeof(struct tcpa_event)) >= limit)
return NULL;
event = addr;
converted_event_size = do_endian_conversion(event->event_size); if (i++ == *pos)
converted_event_type = do_endian_conversion(event->event_type); break;
if (((converted_event_type == 0) && (converted_event_size == 0)) addr += (sizeof(struct tcpa_event) + converted_event_size);
|| ((addr + sizeof(struct tcpa_event) + converted_event_size) } while (1);
>= limit))
return NULL;
return addr; return addr;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册