X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_permission.c;h=01b30e1dd21b2c34d21d71618d7c73725807b394;hb=1db90b29ad676c2cf1888ef5a7c623161ff23bf9;hp=4b4f9b9f3ce91b94c0f176033c9e3ba6ac690010;hpb=f7df2365bc51a7b2804f9b497cbc6bc340dd9da1;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_permission.c b/lustre/mdd/mdd_permission.c index 4b4f9b9..01b30e1 100644 --- a/lustre/mdd/mdd_permission.c +++ b/lustre/mdd/mdd_permission.c @@ -23,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2016, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,7 +40,6 @@ #define DEBUG_SUBSYSTEM S_MDS #include -#include #include #include #include @@ -63,8 +62,15 @@ int mdd_acl_chmod(const struct lu_env *env, struct mdd_object *o, __u32 mode, ENTRY; lu_buf_check_and_alloc(&mdd_env_info(env)->mti_xattr_buf, - mdd_obj2mdd_dev(o)->mdd_dt_conf.ddp_max_ea_size); + MIN(mdd_obj2mdd_dev(o)->mdd_dt_conf.ddp_max_ea_size, + XATTR_SIZE_MAX)); buf = mdd_env_info(env)->mti_xattr_buf; + if (buf.lb_buf == NULL) + RETURN(-ENOMEM); + + if (buf.lb_len > XATTR_SIZE_MAX) + buf.lb_len = XATTR_SIZE_MAX; + rc = mdo_xattr_get(env, o, &buf, XATTR_NAME_ACL_ACCESS); if ((rc == -EOPNOTSUPP) || (rc == -ENODATA)) RETURN(0); @@ -211,8 +217,15 @@ static int mdd_check_acl(const struct lu_env *env, struct mdd_object *obj, ENTRY; lu_buf_check_and_alloc(&mdd_env_info(env)->mti_xattr_buf, - mdd_obj2mdd_dev(obj)->mdd_dt_conf.ddp_max_ea_size); + MIN(mdd_obj2mdd_dev(obj)->mdd_dt_conf.ddp_max_ea_size, + XATTR_SIZE_MAX)); buf = mdd_env_info(env)->mti_xattr_buf; + if (buf.lb_buf == NULL) + RETURN(-ENOMEM); + + if (buf.lb_len > XATTR_SIZE_MAX) + buf.lb_len = XATTR_SIZE_MAX; + rc = mdo_xattr_get(env, obj, &buf, XATTR_NAME_ACL_ACCESS); if (rc <= 0) RETURN(rc ? : -EACCES); @@ -302,9 +315,8 @@ check_capabilities: RETURN(-EACCES); } -int mdd_permission(const struct lu_env *env, - struct md_object *pobj, struct md_object *cobj, - struct md_attr *ma, int mask) +int mdd_permission(const struct lu_env *env, struct md_object *pobj, + struct md_object *cobj, struct md_attr *ma, int mask) { struct mdd_object *mdd_pobj = NULL; struct mdd_object *mdd_cobj; @@ -328,12 +340,6 @@ int mdd_permission(const struct lu_env *env, if (rc) RETURN(rc); - /* For cross_open case, the "mask" is open flags, - * so convert it to permission mask first. - * XXX: MDS_OPEN_CROSS must be NOT equal to permission mask MAY_*. */ - if (unlikely(mask & MDS_OPEN_CROSS)) - mask = accmode(env, cattr, mask & ~MDS_OPEN_CROSS); - rc = mdd_permission_internal_locked(env, mdd_cobj, cattr, mask & ~MAY_RGETFACL, MOR_TGT_CHILD);