From: Thomas Huth <thuth@redhat.com>
To: Laurent Vivier <laurent@vivier.eu>, qemu-devel@nongnu.org
Subject: [PATCH] linux-user/syscall: Silence warning from the undefined behavior sanitizer
Date: Thu, 11 Feb 2021 14:29:59 +0100 [thread overview]
Message-ID: <20210211132959.574168-1-thuth@redhat.com> (raw)
When compiling QEMU with -fsanitize=undefined, there is a warning when
running "make check-tcg":
TEST linux-test on m68k
../linux-user/syscall.c:10499:34: runtime error: member access within
misaligned address 0x00008006df3c for type 'struct linux_dirent64',
which requires 8 byte alignment
0x00008006df3c: note: pointer points here
00 00 00 00 68 03 28 00 00 00 00 00 5b 96 3e e4 61 4b 05 26 18 00 04 2e 00 00 00 00 da 3f 18 00
^
It's likely not an issue in reality, since I assume that on hosts where
the alignment really matters (like sparc64), the Linux kernel likely
adds the right padding. Anyway, let's use the stw_p() / stq_p() accessor
helpers here to silence the warning and thus to allow to compile the code
with -fsanitize=undefined, too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
linux-user/syscall.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 34760779c8..50de535ade 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -10491,20 +10491,22 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
return -TARGET_EFAULT;
ret = get_errno(sys_getdents64(arg1, dirp, count));
if (!is_error(ret)) {
- struct linux_dirent64 *de;
+ char *de;
int len = ret;
int reclen;
- de = dirp;
+ de = (char *)dirp;
+ #define de64(x) offsetof(struct linux_dirent64, x)
while (len > 0) {
- reclen = de->d_reclen;
+ reclen = lduw_he_p(de + de64(d_reclen));
if (reclen > len)
break;
- de->d_reclen = tswap16(reclen);
- tswap64s((uint64_t *)&de->d_ino);
- tswap64s((uint64_t *)&de->d_off);
- de = (struct linux_dirent64 *)((char *)de + reclen);
+ stw_p(de + de64(d_reclen), reclen);
+ stq_p(de + de64(d_ino), ldq_he_p(de + de64(d_ino)));
+ stq_p(de + de64(d_off), ldq_he_p(de + de64(d_off)));
+ de += reclen;
len -= reclen;
}
+ #undef de64
}
unlock_user(dirp, arg2, ret);
}
--
2.27.0
next reply other threads:[~2021-02-11 13:57 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-11 13:29 Thomas Huth [this message]
2021-02-11 21:28 ` [PATCH] linux-user/syscall: Silence warning from the undefined behavior sanitizer Laurent Vivier
2021-02-12 0:35 ` Laurent Vivier
2021-02-12 7:56 ` Thomas Huth
2021-02-12 7:45 ` Thomas Huth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210211132959.574168-1-thuth@redhat.com \
--to=thuth@redhat.com \
--cc=laurent@vivier.eu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).