lkml.org 
[lkml]   [2019]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] tpm/eventlog/tpm1: Simplify walking over *pos measurements
    Date
    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.

    Current logic is complicated a bit. Just employ a do-while loop
    with necessary sanity check, and then get the goal.

    Signed-off-by: Jia Zhang <zhang.jia@linux.alibaba.com>
    ---
    drivers/char/tpm/eventlog/tpm1.c | 37 ++++++++++++++-----------------------
    1 file changed, 14 insertions(+), 23 deletions(-)

    diff --git a/drivers/char/tpm/eventlog/tpm1.c b/drivers/char/tpm/eventlog/tpm1.c
    index 58c8478..4cf8303 100644
    --- a/drivers/char/tpm/eventlog/tpm1.c
    +++ b/drivers/char/tpm/eventlog/tpm1.c
    @@ -74,7 +74,7 @@
    /* 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;
    }
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2019-01-11 10:01    [W:2.726 / U:0.804 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site