On Sat, 26 May 2018 01:23:09 -0400
keno@juliacomputing.com wrote:
> From: Keno Fischer <keno@alumni.harvard.edu>
>
> This code relied on P9_DOTL_AT_REMOVEDIR and AT_REMOVEDIR having the same
> numerical value, but on Darwin, they do not.
>
> Signed-off-by: Keno Fischer <keno@juliacomputing.com>
> ---
> hw/9pfs/9p-local.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
> index 6e0b2e8..c55ea25 100644
> --- a/hw/9pfs/9p-local.c
> +++ b/hw/9pfs/9p-local.c
> @@ -1376,7 +1376,17 @@ static int local_unlinkat(FsContext *ctx, V9fsPath *dir,
> return -1;
> }
>
> - ret = local_unlinkat_common(ctx, dirfd, name, flags);
> + if ((flags & ~P9_DOTL_AT_REMOVEDIR) != 0) {
The != 0 isn't needed but...
> + errno = EINVAL;
> + return -1;
... I'm more concerned about this new error path. How can this happen ?
> + }
> +
> + size_t rflags = 0;
Please declare this at the beginning of the function.
> + if (flags & P9_DOTL_AT_REMOVEDIR) {
> + rflags |= AT_REMOVEDIR;
> + }
> +
> + ret = local_unlinkat_common(ctx, dirfd, name, rflags);
> close_preserve_errno(dirfd);
> return ret;
> }