On Thu, 31 May 2018 21:26:04 -0400
Keno Fischer 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
> ---
>
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;
> }