On Thu, Aug 21, 2025 at 10:34:18AM +0800, Gary Lin wrote:
> On Tue, Aug 19, 2025 at 06:43:15PM +0530, Sudhakar Kuppusamy wrote:
> > If secure boot is enabled with static key management mode, the trusted
> > certificates will be extracted from the GRUB ELF Note and added to db list.
> > This is introduced by a subsequent patch.
> >
> > If secure boot is enabled with dynamic key management mode, the trusted
> > certificates and certificate/binary hash will be extracted from the PKS
> > and added to db list. The distrusted certificates, certificate/binary hash
> > are read from the PKS and added to dbx list. Both dbx and db lists are
> > introduced by
> > a subsequent patch.
> >
> > Note:-
> >
> > If the certificate or the certificate hash exists in the dbx list, then
> > do not add that certificate/certificate hash to the db list.
> >
> > Signed-off-by: Sudhakar Kuppusamy <[email protected]>
> > Reviewed-by: Stefan Berger <[email protected]>
> > Reviewed-by: Avnish Chouhan <[email protected]>
> > ---
> > grub-core/commands/appendedsig/appendedsig.c | 452 ++++++++++++++++++-
> > include/grub/crypto.h | 1 +
> > include/grub/efi/pks.h | 112 +++++
> > include/grub/types.h | 4 +
> > 4 files changed, 563 insertions(+), 6 deletions(-)
> > create mode 100644 include/grub/efi/pks.h
> >
-->8--
> > +/* Add the certificate/binary hash into the db/dbx list. */
> > +static grub_err_t
> > +add_hash (const grub_uint8_t **data, const grub_size_t data_size,
> Do you intend to make 'data' a const variable in 'add_hash()'? If so, it
> should be 'grub_uint8_t ** const data'. With 'const grub_uint8_t **',
> 'data' becomes a pointer to a constant, and it doesn't match the
> parameter passed in create_dbx_list().
>
> > + grub_uint8_t ***signature_list, grub_size_t
> > **signature_size_list,
> > + grub_uint32_t *signature_list_entries)
> > +{
> > + grub_uint8_t **signatures;
> > + grub_size_t *signature_size;
> > + grub_uint32_t signature_entries = *signature_list_entries;
> > +
> > + if (*data == NULL || data_size == 0)
> > + return grub_error (GRUB_ERR_OUT_OF_RANGE, "certificate/binary-hash
> > data or size is not available");
> > +
> > + signatures = grub_realloc (*signature_list, sizeof (grub_uint8_t *) *
> > (signature_entries + 1));
> > + if (signatures == NULL)
> > + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> > +
> > + signature_size = grub_realloc (*signature_size_list,
> > + sizeof (grub_size_t) * (signature_entries
> > + 1));
> > + if (signature_size == NULL)
> > + {
> > + /*
> > + * Allocated memory will be freed by
> > + * free_db_list/free_dbx_list.
> > + */
> > + signatures[signature_entries + 1] = NULL;
> > + *signature_list = signatures;
> > + *signature_list_entries = signature_entries + 1;
> > +
> > + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> > + }
> > +
> > + signatures[signature_entries] = (grub_uint8_t *) *data;
> > + signature_size[signature_entries] = data_size;
> > + signature_entries++;
> > + *data = NULL;
It seems that you want to use the memory from '*data' directly instead of
allocating a new buffer for the signature entry. It may be fine for some
local variables in other functions, but 'grub_pks_keystore.db[].data' and
'grub_pks_keystore.dbx[].data' are also the candidates of 'data'. By
setting '*data' to 'NULL', the data pointers of PKS variables were clean
up after invoking 'add_hash()'. It doesn't look an expected behavior to
me.
I'd suggest to declare 'data' as 'grub_uint8_t *' or 'grub_uint8_t *
const' and allocate a new buffer for signatures[signature_entries].
This keeps the 'data' pointer valid after invoking 'add_hash()' and
also prevents the 'address-of-packed-member' error mentioned in the
previous mail.
Cheers,
Gary Lin
> > +
> > + *signature_list = signatures;
> > + *signature_size_list = signature_size;
> > + *signature_list_entries = signature_entries;
> > +
> > + return GRUB_ERR_NONE;
> > +}
> > +
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel