]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tpm: Simplify the measurements loop
authorJia Zhang <zhang.jia@linux.alibaba.com>
Fri, 11 Jan 2019 08:59:32 +0000 (16:59 +0800)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Wed, 13 Feb 2019 07:47:00 +0000 (09:47 +0200)
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 <zhang.jia@linux.alibaba.com>
Reviewd-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
drivers/char/tpm/eventlog/tpm1.c

index 58c84784ba25c72020e233fd3cbe82f12945aa16..4cf830333684d6b19bbbedbf2a10a212521c915f 100644 (file)
@@ -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,38 +83,29 @@ 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;
+               if (((converted_event_type == 0) && (converted_event_size == 0))
+                   || ((addr + sizeof(struct tcpa_event) + converted_event_size)
+                       >= limit))
+                       return NULL;
 
-       converted_event_size = do_endian_conversion(event->event_size);
-       converted_event_type = do_endian_conversion(event->event_type);
+               if (i++ == *pos)
+                       break;
 
-       if (((converted_event_type == 0) && (converted_event_size == 0))
-           || ((addr + sizeof(struct tcpa_event) + converted_event_size)
-               >= limit))
-               return NULL;
+               addr += (sizeof(struct tcpa_event) + converted_event_size);
+       } while (1);
 
        return addr;
 }