On Mon, 27 Mar 2017 18:59:04 +0100
Peter Maydell <peter.mayd...@linaro.org> wrote:

> For a packed struct like 'P9Hdr' the fields within it may not be
> aligned as much as the natural alignment for their types.  This means
> it is not valid to pass the address of such a field to a function
> like le32_to_cpus() which operate on uint32_t* and assume alignment.
> Doing this results in a SIGBUS on hosts like SPARC which have strict
> alignment requirements.
> 
> Use ldl_le_p() instead, which is specified to correctly handle
> unaligned pointers.
> 
> Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
> ---

Reviewed-by: Greg Kurz <gr...@kaod.org>

I'll apply this to my tree and send a pull request tomorrow.

Cheers.

--
Greg

> Sadly gcc doesn't warn about this:
>  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51628
> clang supposedly was fixed to do so:
>  https://bugs.llvm.org//show_bug.cgi?id=22821
> but I think that commit was reverted without the bug being
> reopened; at least my clang doesn't have that warning flag.
> ---
>  tests/virtio-9p-test.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c
> index 43a1ad8..ad33d96 100644
> --- a/tests/virtio-9p-test.c
> +++ b/tests/virtio-9p-test.c
> @@ -256,8 +256,8 @@ static void v9fs_req_recv(P9Req *req, uint8_t id)
>          qvirtio_wait_queue_isr(v9p->dev, v9p->vq, 1000 * 1000);
>  
>          v9fs_memread(req, &hdr, 7);
> -        le32_to_cpus(&hdr.size);
> -        le16_to_cpus(&hdr.tag);
> +        hdr.size = ldl_le_p(&hdr.size);
> +        hdr.tag = lduw_le_p(&hdr.tag);
>          if (hdr.size >= 7) {
>              break;
>          }

Attachment: pgpPg_6kMUAvS.pgp
Description: OpenPGP digital signature

Reply via email to