Commit aca6897f authored by Keno Fischer's avatar Keno Fischer Committed by Greg Kurz
Browse files

9p: xattr: Properly translate xattrcreate flags



As with unlinkat, these flags come from the client and need to
be translated to their host values. The protocol values happen
to match linux, but that need not be true in general.

Signed-off-by: default avatarKeno Fischer <keno@juliacomputing.com>
Signed-off-by: default avatarGreg Kurz <groug@kaod.org>
parent 67e87345
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -3327,7 +3327,7 @@ out_nofid:

static void coroutine_fn v9fs_xattrcreate(void *opaque)
{
    int flags;
    int flags, rflags = 0;
    int32_t fid;
    uint64_t size;
    ssize_t err = 0;
@@ -3344,6 +3344,19 @@ static void coroutine_fn v9fs_xattrcreate(void *opaque)
    }
    trace_v9fs_xattrcreate(pdu->tag, pdu->id, fid, name.data, size, flags);

    if (flags & ~(P9_XATTR_CREATE | P9_XATTR_REPLACE)) {
        err = -EINVAL;
        goto out_nofid;
    }

    if (flags & P9_XATTR_CREATE) {
        rflags |= XATTR_CREATE;
    }

    if (flags & P9_XATTR_REPLACE) {
        rflags |= XATTR_REPLACE;
    }

    if (size > XATTR_SIZE_MAX) {
        err = -E2BIG;
        goto out_nofid;
@@ -3365,7 +3378,7 @@ static void coroutine_fn v9fs_xattrcreate(void *opaque)
    xattr_fidp->fs.xattr.copied_len = 0;
    xattr_fidp->fs.xattr.xattrwalk_fid = false;
    xattr_fidp->fs.xattr.len = size;
    xattr_fidp->fs.xattr.flags = flags;
    xattr_fidp->fs.xattr.flags = rflags;
    v9fs_string_init(&xattr_fidp->fs.xattr.name);
    v9fs_string_copy(&xattr_fidp->fs.xattr.name, &name);
    xattr_fidp->fs.xattr.value = g_malloc0(size);
+4 −0
Original line number Diff line number Diff line
@@ -169,6 +169,10 @@ typedef struct V9fsConf
    char *fsdev_id;
} V9fsConf;

/* 9p2000.L xattr flags (matches Linux values) */
#define P9_XATTR_CREATE 1
#define P9_XATTR_REPLACE 2

typedef struct V9fsXattr
{
    uint64_t copied_len;