From: Laurent Vivier <laurent@vivier.eu>
To: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Cc: Pavel Shamis <pasharesearch@gmail.com>,
Riku Voipio <riku.voipio@iki.fi>,
patches@linaro.org
Subject: Re: [Qemu-devel] [PATCH] linux-user: Don't assert if guest tries shmdt(0)
Date: Thu, 11 Feb 2016 12:19:04 +0100 [thread overview]
Message-ID: <56BC6E28.70201@vivier.eu> (raw)
In-Reply-To: <1455033431-24034-1-git-send-email-peter.maydell@linaro.org>
Le 09/02/2016 16:57, Peter Maydell a écrit :
> Our implementation of shmat() and shmdt() for linux-user was
> using "zero guest address" as its marker for "entry in the
> shm_regions[] array is not in use". This meant that if the
> guest did a shmdt(0) we would match on an unused array entry
> and call page_set_flags() with both start and end addresses zero,
> which causes an assertion failure.
>
> Use an explicit in_use flag to manage the shm_regions[] array,
> so that we avoid this problem.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reported-by: Pavel Shamis <pasharesearch@gmail.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
> linux-user/syscall.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 54ce14a..f46abf7 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -2598,8 +2598,9 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
> #define N_SHM_REGIONS 32
>
> static struct shm_region {
> - abi_ulong start;
> - abi_ulong size;
> + abi_ulong start;
> + abi_ulong size;
> + bool in_use;
> } shm_regions[N_SHM_REGIONS];
>
> struct target_semid_ds
> @@ -3291,7 +3292,8 @@ static inline abi_ulong do_shmat(int shmid, abi_ulong shmaddr, int shmflg)
> ((shmflg & SHM_RDONLY)? 0 : PAGE_WRITE));
>
> for (i = 0; i < N_SHM_REGIONS; i++) {
> - if (shm_regions[i].start == 0) {
> + if (!shm_regions[i].in_use) {
> + shm_regions[i].in_use = true;
> shm_regions[i].start = raddr;
> shm_regions[i].size = shm_info.shm_segsz;
> break;
> @@ -3308,8 +3310,8 @@ static inline abi_long do_shmdt(abi_ulong shmaddr)
> int i;
>
> for (i = 0; i < N_SHM_REGIONS; ++i) {
> - if (shm_regions[i].start == shmaddr) {
> - shm_regions[i].start = 0;
> + if (shm_regions[i].in_use && shm_regions[i].start == shmaddr) {
> + shm_regions[i].in_use = false;
> page_set_flags(shmaddr, shmaddr + shm_regions[i].size, 0);
> break;
> }
>
prev parent reply other threads:[~2016-02-11 11:19 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-09 15:57 [Qemu-devel] [PATCH] linux-user: Don't assert if guest tries shmdt(0) Peter Maydell
2016-02-10 18:39 ` Laurent Vivier
2016-02-10 20:22 ` Peter Maydell
2016-02-11 11:19 ` Laurent Vivier [this message]
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=56BC6E28.70201@vivier.eu \
--to=laurent@vivier.eu \
--cc=pasharesearch@gmail.com \
--cc=patches@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=riku.voipio@iki.fi \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.