diff options
Diffstat (limited to 'xlators/nfs/server/src/acl3.c')
| -rw-r--r-- | xlators/nfs/server/src/acl3.c | 35 | 
1 files changed, 25 insertions, 10 deletions
diff --git a/xlators/nfs/server/src/acl3.c b/xlators/nfs/server/src/acl3.c index 59c7637e3b4..5286077a891 100644 --- a/xlators/nfs/server/src/acl3.c +++ b/xlators/nfs/server/src/acl3.c @@ -66,7 +66,8 @@ nfs3_stat_to_fattr3 (struct iatt *buf);  #define acl3_validate_gluster_fh(handle, status, errlabel)              \          do {                                                            \                  if (!nfs3_fh_validate (handle)) {                       \ -                        status = NFS3ERR_SERVERFAULT;                   \ +                        gf_log (GF_ACL, GF_LOG_ERROR, "Bad Handle");    \ +                        status = NFS3ERR_BADHANDLE;                     \                          goto errlabel;                                  \                  }                                                       \          } while (0)                                                     \ @@ -321,6 +322,7 @@ acl3_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          getaclreply                     *getaclreply = NULL;          int                             ret = -1;          nfs_user_t                      nfu = {0, }; +        uint64_t                        deviceid = 0;          if (!frame->local) {                  gf_log (GF_ACL, GF_LOG_ERROR, "Invalid argument," @@ -336,14 +338,18 @@ acl3_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto err;          } -        getaclreply->attr_follows = 1; +        /* Fill the attrs before xattrs */ +        getaclreply->attr_follows = TRUE; +        deviceid = nfs3_request_xlator_deviceid (cs->req); +        nfs3_map_deviceid_to_statdev (buf, deviceid);          getaclreply->attr = nfs3_stat_to_fattr3 (buf); -        getaclreply->mask = 0xf; +        getaclreply->mask = (NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT); +          nfs_request_user_init (&nfu, cs->req); -        ret = nfs_getxattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, NULL, NULL, -                            acl3_getacl_cbk, cs); -        if (ret == -1) { -                stat = nfs3_cbk_errno_status (op_ret, op_errno); +        ret = nfs_getxattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, +                            NULL, NULL, acl3_getacl_cbk, cs); +        if (ret < 0) { +                stat = nfs3_errno_to_nfsstat3 (-ret);                  goto err;          }          return 0; @@ -409,6 +415,13 @@ acl3svc_getacl (rpcsvc_request_t *req)                  rpcsvc_request_seterr (req, GARBAGE_ARGS);                  goto rpcerr;          } + +        /* Validate ACL mask */ +        if (getaclargs.mask & ~(NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT)) { +                stat = NFS3ERR_INVAL; +                goto acl3err; +        } +          fhp = &fh;          acl3_validate_gluster_fh (&fh, stat, acl3err);          acl3_map_fh_to_volume (nfs->nfs3state, fhp, req, @@ -470,11 +483,13 @@ acl3_setacl_resume (void *carg)          nfs_request_user_init (&nfu, cs->req);          xattr = dict_new();          if (cs->aclcount) -        ret = dict_set_static_bin (xattr, POSIX_ACL_ACCESS_XATTR, cs->aclxattr, -                                   cs->aclcount * 8 + 4); +        ret = dict_set_static_bin (xattr, POSIX_ACL_ACCESS_XATTR, +                                   cs->aclxattr, +                                   posix_acl_xattr_size (cs->aclcount));          if (cs->daclcount)          ret = dict_set_static_bin (xattr, POSIX_ACL_DEFAULT_XATTR, -                                   cs->daclxattr, cs->daclcount * 8 + 4); +                                   cs->daclxattr, +                                   posix_acl_xattr_size (cs->daclcount));          ret = nfs_setxattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, xattr,                              0, NULL, acl3_setacl_cbk, cs);  | 
