Thanks Kees,

I confirm that with below patch on top of 4.12.0-rc2 pstore efi vars is now 
working as expected again.

BR,
Marta

> -----Original Message-----
> From: Kees Cook [mailto:keesc...@chromium.org]
> Sent: Friday, May 19, 2017 9:27 PM
> To: Lofstedt, Marta <marta.lofst...@intel.com>
> Cc: Anton Vorontsov <an...@enomsg.org>; Colin Cross
> <ccr...@android.com>; Luck, Tony <tony.l...@intel.com>; Matt Fleming
> <m...@codeblueprint.co.uk>; Ard Biesheuvel <ard.biesheu...@linaro.org>;
> linux-efi@vger.kernel.org; linux-ker...@vger.kernel.org
> Subject: [PATCH] efi-pstore: Fix write/erase id tracking
> 
> Prior to the pstore interface refactoring, the "id" generated during a backend
> pstore_write() was only retained by the internal pstore inode tracking list.
> Additionally the "part" was ignored, so EFI would encode this in the id. This
> corrects the misunderstandings and correctly sets "id" during pstore_write(),
> and uses "part"
> directly during pstore_erase().
> 
> Reported-by: Marta Lofstedt <marta.lofst...@intel.com>
> Fixes: 76cc9580e3fb ("pstore: Replace arguments for write() API")
> Fixes: a61072aae693 ("pstore: Replace arguments for erase() API")
> Signed-off-by: Kees Cook <keesc...@chromium.org>
> ---
> Since the pstore refactor broke this, I intend to push this via the pstore 
> tree.
> ---
>  drivers/firmware/efi/efi-pstore.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-
> pstore.c
> index 44148fd4c9f2..dda2e96328c0 100644
> --- a/drivers/firmware/efi/efi-pstore.c
> +++ b/drivers/firmware/efi/efi-pstore.c
> @@ -53,6 +53,7 @@ static int efi_pstore_read_func(struct efivar_entry
> *entry,
>       if (sscanf(name, "dump-type%u-%u-%d-%lu-%c",
>                  &record->type, &part, &cnt, &time,
> &data_type) == 5) {
>               record->id = generic_id(time, part, cnt);
> +             record->part = part;
>               record->count = cnt;
>               record->time.tv_sec = time;
>               record->time.tv_nsec = 0;
> @@ -64,6 +65,7 @@ static int efi_pstore_read_func(struct efivar_entry
> *entry,
>       } else if (sscanf(name, "dump-type%u-%u-%d-%lu",
>                  &record->type, &part, &cnt, &time) == 4) {
>               record->id = generic_id(time, part, cnt);
> +             record->part = part;
>               record->count = cnt;
>               record->time.tv_sec = time;
>               record->time.tv_nsec = 0;
> @@ -77,6 +79,7 @@ static int efi_pstore_read_func(struct efivar_entry
> *entry,
>                * multiple logs, remains.
>                */
>               record->id = generic_id(time, part, 0);
> +             record->part = part;
>               record->count = 0;
>               record->time.tv_sec = time;
>               record->time.tv_nsec = 0;
> @@ -241,9 +244,15 @@ static int efi_pstore_write(struct pstore_record
> *record)
>       efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
>       int i, ret = 0;
> 
> +     record->time.tv_sec = get_seconds();
> +     record->time.tv_nsec = 0;
> +
> +     record->id = generic_id(record->time.tv_sec, record->part,
> +                             record->count);
> +
>       snprintf(name, sizeof(name), "dump-type%u-%u-%d-%lu-
> %c",
>                record->type, record->part, record->count,
> -              get_seconds(), record->compressed ? 'C' : 'D');
> +              record->time.tv_sec, record->compressed ? 'C'
> : 'D');
> 
>       for (i = 0; i < DUMP_NAME_LEN; i++)
>               efi_name[i] = name[i];
> @@ -255,7 +264,6 @@ static int efi_pstore_write(struct pstore_record
> *record)
>       if (record->reason == KMSG_DUMP_OOPS)
>               efivar_run_worker();
> 
> -     record->id = record->part;
>       return ret;
>  };
> 
> @@ -287,7 +295,7 @@ static int efi_pstore_erase_func(struct efivar_entry
> *entry, void *data)
>                * holding multiple logs, remains.
>                */
>               snprintf(name_old, sizeof(name_old), "dump-
> type%u-%u-%lu",
> -                     ed->record->type, (unsigned
> int)ed->record->id,
> +                     ed->record->type, ed->record-
> >part,
>                       ed->record->time.tv_sec);
> 
>               for (i = 0; i < DUMP_NAME_LEN; i++)
> @@ -320,10 +328,7 @@ static int efi_pstore_erase(struct pstore_record
> *record)
>       char name[DUMP_NAME_LEN];
>       efi_char16_t efi_name[DUMP_NAME_LEN];
>       int found, i;
> -     unsigned int part;
> 
> -     do_div(record->id, 1000);
> -     part = do_div(record->id, 100);
>       snprintf(name, sizeof(name), "dump-type%u-%u-%d-%lu",
>                record->type, record->part, record->count,
>                record->time.tv_sec);
> --
> 2.7.4
> 
> 
> --
> Kees Cook
> Pixel Security
--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to