Commit bb3b6b0f authored by Jia Zhang's avatar Jia Zhang Committed by Jarkko Sakkinen
Browse files

tpm: Simplify the measurements loop



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: default avatarJia Zhang <zhang.jia@linux.alibaba.com>
Reviewd-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent 442601e8
Loading
Loading
Loading
Loading
+14 −23
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ static const char* tcpa_pc_event_id_strings[] = {
/* returns pointer to start of pos. entry of tcg log */
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_bios_log *log = &chip->log;
	void *addr = log->bios_event_log;
@@ -83,39 +83,30 @@ static void *tpm1_bios_measurements_start(struct seq_file *m, loff_t *pos)
	u32 converted_event_size;
	u32 converted_event_type;


	/* read over *pos measurements */
	for (i = 0; i < *pos; i++) {
	do {
		event = addr;

		/* check if current entry is valid */
		if (addr + sizeof(struct tcpa_event) >= limit)
			return NULL;

		converted_event_size =
		    do_endian_conversion(event->event_size);
		converted_event_type =
		    do_endian_conversion(event->event_type);

		if ((addr + sizeof(struct tcpa_event)) < limit) {
			if ((converted_event_type == 0) &&
			    (converted_event_size == 0))
				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);
	converted_event_type = do_endian_conversion(event->event_type);

		if (((converted_event_type == 0) && (converted_event_size == 0))
		    || ((addr + sizeof(struct tcpa_event) + converted_event_size)
			>= limit))
			return NULL;

		if (i++ == *pos)
			break;

		addr += (sizeof(struct tcpa_event) + converted_event_size);
	} while (1);

	return addr;
}