|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 2/3] hvmloader: fix SMBIOS table length checks
On 30.07.2025 11:56, Petr Beneš wrote:
> --- a/tools/firmware/hvmloader/smbios.c
> +++ b/tools/firmware/hvmloader/smbios.c
> @@ -47,6 +47,8 @@ static void
> smbios_pt_init(void);
> static void*
> get_smbios_pt_struct(uint8_t type, uint32_t *length_out);
> +static void *
> +smbios_pt_copy(void *start, uint8_t type, uint16_t handle, size_t
> table_size);
> static void
> get_cpu_manufacturer(char *buf, int len);
> static int
> @@ -154,6 +156,24 @@ get_smbios_pt_struct(uint8_t type, uint32_t *length_out)
> return NULL;
> }
>
> +static void *
> +smbios_pt_copy(void *start, uint8_t type, uint16_t handle, size_t table_size)
> +{
> + struct smbios_structure_header *header = start;
> + void *pts;
> + uint32_t length;
> +
> + pts = get_smbios_pt_struct(type, &length);
> + if ( pts != NULL && length >= table_size )
With this, the function parameter may better be named "min_size" or "req_size".
(I was first irritated by ...
> @@ -381,16 +401,17 @@ smbios_type_0_init(void *start, const char *xen_version,
> struct smbios_type_0 *p = start;
> static const char *smbios_release_date = __SMBIOS_DATE__;
> const char *s;
> - void *pts;
> - uint32_t length;
> + void *next;
>
> - pts = get_smbios_pt_struct(0, &length);
> - if ( pts != NULL && length > 0 )
> - {
> - memcpy(start, pts, length);
> - p->header.handle = SMBIOS_HANDLE_TYPE0;
> - return start + length;
> - }
> + /*
> + * Specification says Type 0 table has length of at least 18h for
> v2.4-3.0.
> + */
> +
> + BUILD_BUG_ON(sizeof(*p) != 24);
... there being != here, despite the comment saying "at least". And the
check here is ...
> + next = smbios_pt_copy(start, 0, SMBIOS_HANDLE_TYPE0, sizeof(*p));
... for the sizeof() use here, aiui.)
> @@ -498,26 +517,30 @@ smbios_type_2_init(void *start)
> {
> struct smbios_type_2 *p = start;
> const char *s;
> - uint8_t *ptr;
> - void *pts;
> - uint32_t length;
> + void *next;
> unsigned int counter = 0;
>
> - pts = get_smbios_pt_struct(2, &length);
> - if ( pts != NULL && length > 0 )
> - {
> - memcpy(start, pts, length);
> - p->header.handle = SMBIOS_HANDLE_TYPE2;
> + /*
> + * Specification says Type 2 table has length of at least 08h,
> + * which corresponds with the end of the "Serial Number" field.
> + */
> +
> + BUILD_BUG_ON(offsetof_end(struct smbios_type_2, serial_number_str) != 8);
>
> + next = smbios_pt_copy(start, 2, SMBIOS_HANDLE_TYPE2,
> + offsetof_end(struct smbios_type_3,
Was this meant to be smbios_type_2?
With the adjustments
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
The adjustments also look to be isolated enough to carry out while committing.
Provided of course that you agree with making them.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |