]> git.proxmox.com Git - mirror_qemu.git/commit - hw/tpm/tpm_passthrough.c
tpm: fix alignment issues
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Mon, 29 Jan 2018 18:33:03 +0000 (19:33 +0100)
committerStefan Berger <stefanb@linux.vnet.ibm.com>
Mon, 29 Jan 2018 19:21:42 +0000 (14:21 -0500)
commitcc1b6c5533b77eac7caea269897b03a940797a8c
tree9f4c8c7f00015878bde2d7cbb4126df7185efdcf
parent302705876492a39f568035ce346e2c9176f5665e
tpm: fix alignment issues

The new tpm-crb-test fails on sparc host:

TEST: tests/tpm-crb-test... (pid=230409)
  /i386/tpm-crb/test:
Broken pipe
FAIL
GTester: last random seed: R02S29cea50247fe1efa59ee885a26d51a85
(pid=230423)
FAIL: tests/tpm-crb-test

and generates a new clang sanitizer runtime warning:

/home/petmay01/linaro/qemu-for-merges/hw/tpm/tpm_util.h:36:24: runtime
error: load of misaligned address 0x7fdc24c00002 for type 'const
uint32_t' (aka 'const unsigned int'), which requires 4 byte alignment
0x7fdc24c00002: note: pointer points here
<memory cannot be printed>

The sparc architecture does not allow misaligned loads and will
segfault if you try them.  For example, this function:

static inline uint32_t tpm_cmd_get_size(const void *b)
{
    return be32_to_cpu(*(const uint32_t *)(b + 2));
}

Should read,
    return ldl_be_p(b + 2);

As a general rule you can't take an arbitrary pointer into a byte
buffer and try to interpret it as a structure or a pointer to a
larger-than-bytesize-data simply by casting the pointer.

Use this clean up as an opportunity to remove unnecessary temporary
buffers and casts.

Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
hw/tpm/tpm_emulator.c
hw/tpm/tpm_passthrough.c
hw/tpm/tpm_util.c
hw/tpm/tpm_util.h