qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 09/20] 9p: Properly check/translate flags in


From: Greg Kurz
Subject: Re: [Qemu-devel] [PATCH v2 09/20] 9p: Properly check/translate flags in unlinkat
Date: Fri, 1 Jun 2018 12:13:51 +0200

On Thu, 31 May 2018 21:26:04 -0400
Keno Fischer <address@hidden> wrote:

> This code previously relied on P9_DOTL_AT_REMOVEDIR and AT_REMOVEDIR
> having the same numerical value and deferred any errorchecking to the
> syscall itself. However, while the former assumption is true on Linux,
> it is not true in general. Thus, add appropriate error checking and
> translation to the 9p unlinkat server code.
> 
> Signed-off-by: Keno Fischer <address@hidden>
> ---
> 

Looks good but handle_unlinkat() needs to be adapted to this change.
Other backends (proxy and synth) seem to ignore the flags.

> Changes since v1:
>  * Code was moved from 9p-local.c to server entry point in 9p.c
> 
>  hw/9pfs/9p.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
> index b80db65..a757374 100644
> --- a/hw/9pfs/9p.c
> +++ b/hw/9pfs/9p.c
> @@ -2522,7 +2522,7 @@ static void coroutine_fn v9fs_unlinkat(void *opaque)
>  {
>      int err = 0;
>      V9fsString name;
> -    int32_t dfid, flags;
> +    int32_t dfid, flags, rflags = 0;
>      size_t offset = 7;
>      V9fsPath path;
>      V9fsFidState *dfidp;
> @@ -2549,6 +2549,15 @@ static void coroutine_fn v9fs_unlinkat(void *opaque)
>          goto out_nofid;
>      }
>  
> +    if (flags & ~P9_DOTL_AT_REMOVEDIR) {
> +        err = -EINVAL;
> +        goto out_nofid;
> +    }
> +
> +    if (flags & P9_DOTL_AT_REMOVEDIR) {
> +        rflags |= AT_REMOVEDIR;
> +    }
> +
>      dfidp = get_fid(pdu, dfid);
>      if (dfidp == NULL) {
>          err = -EINVAL;
> @@ -2567,7 +2576,7 @@ static void coroutine_fn v9fs_unlinkat(void *opaque)
>      if (err < 0) {
>          goto out_err;
>      }
> -    err = v9fs_co_unlinkat(pdu, &dfidp->path, &name, flags);
> +    err = v9fs_co_unlinkat(pdu, &dfidp->path, &name, rflags);
>      if (!err) {
>          err = offset;
>      }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]