[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/2] acpi-build: don't access unaligned addresse
From: |
Richard Henderson |
Subject: |
Re: [Qemu-devel] [PATCH 2/2] acpi-build: don't access unaligned addresses |
Date: |
Wed, 12 Mar 2014 15:24:23 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 |
On 03/10/2014 12:43 PM, Michael S. Tsirkin wrote:
> casting an unaligned address to e.g.
> uint32_t can trigger undefined behaviour in C.
> Replace cast + assignment with memcpy.
>
> Reported-by: Peter Maydell <address@hidden>
> Signed-off-by: Michael S. Tsirkin <address@hidden>
> ---
> hw/i386/acpi-build.c | 31 ++++++++++++++++---------------
> 1 file changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index b667d31..e08f514 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -466,9 +466,15 @@ static void acpi_align_size(GArray *blob, unsigned align)
> g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align));
> }
>
> -/* Get pointer within table in a safe manner */
> -#define ACPI_BUILD_PTR(table, size, off, type) \
> - ((type *)(acpi_data_get_ptr(table, size, off, sizeof(type))))
> +/* Set a value within table in a safe manner */
> +#define ACPI_BUILD_SET_LE(table, size, off, bits, val) \
> + do { \
> + uint64_t ACPI_BUILD_SET_LE_val = le_bswap(val, bits); \
> + memcpy(acpi_data_get_ptr(table, size, off, \
> + (bits) / BITS_PER_BYTE), \
> + &ACPI_BUILD_SET_LE_val, \
> + (bits) / BITS_PER_BYTE); \
> + } while (0)
>
> static inline void *acpi_data_get_ptr(uint8_t *table_data, unsigned
> table_size,
> unsigned off, unsigned size)
> @@ -974,22 +980,17 @@ static void build_pci_bus_end(PCIBus *bus, void
> *bus_state)
>
> static void patch_pci_windows(PcPciInfo *pci, uint8_t *start, unsigned size)
> {
> - *ACPI_BUILD_PTR(start, size, acpi_pci32_start[0], uint32_t) =
> - cpu_to_le32(pci->w32.begin);
> + ACPI_BUILD_SET_LE(start, size, acpi_pci32_start[0], 32, pci->w32.begin);
You're working too hard at this because you're using the wrong bswap interface.
Also, you missed one.
I'll follow up with a patch I wrote just recently, but hadn't yet gotten around
to posting.
r~