query owner and group attr only on specific getattrs
previously we'd query owner and group file attributes on all getattrs and storing that in nfs41_file_info structure which was caused a problem for readdirs.
This commit is contained in:
parent
83d17fcb69
commit
316dfe568a
5 changed files with 20 additions and 16 deletions
10
daemon/acl.c
10
daemon/acl.c
|
|
@ -269,17 +269,19 @@ static int handle_getacl(nfs41_upcall *upcall)
|
||||||
getacl_upcall_args *args = &upcall->args.getacl;
|
getacl_upcall_args *args = &upcall->args.getacl;
|
||||||
nfs41_open_state *state = upcall->state_ref;
|
nfs41_open_state *state = upcall->state_ref;
|
||||||
nfs41_file_info info;
|
nfs41_file_info info;
|
||||||
bitmap4 attr_request;
|
bitmap4 attr_request = { 0 };
|
||||||
LPSTR domain = NULL;
|
LPSTR domain = NULL;
|
||||||
SECURITY_DESCRIPTOR sec_desc;
|
SECURITY_DESCRIPTOR sec_desc;
|
||||||
PACL dacl = NULL;
|
PACL dacl = NULL;
|
||||||
PSID *sids = NULL;
|
PSID *sids = NULL;
|
||||||
PSID osid = NULL, gsid = NULL;
|
PSID osid = NULL, gsid = NULL;
|
||||||
DWORD sid_len;
|
DWORD sid_len;
|
||||||
|
char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT];
|
||||||
|
|
||||||
// need to cache owner/group information XX
|
// need to cache owner/group information XX
|
||||||
ZeroMemory(&info, sizeof(info));
|
ZeroMemory(&info, sizeof(info));
|
||||||
init_getattr_request(&attr_request);
|
attr_request.count = 2;
|
||||||
|
attr_request.arr[1] = FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
|
||||||
if (args->query & DACL_SECURITY_INFORMATION) {
|
if (args->query & DACL_SECURITY_INFORMATION) {
|
||||||
info.acl = calloc(1, sizeof(nfsacl41));
|
info.acl = calloc(1, sizeof(nfsacl41));
|
||||||
if (info.acl == NULL) {
|
if (info.acl == NULL) {
|
||||||
|
|
@ -288,6 +290,8 @@ static int handle_getacl(nfs41_upcall *upcall)
|
||||||
}
|
}
|
||||||
attr_request.arr[0] |= FATTR4_WORD0_ACL;
|
attr_request.arr[0] |= FATTR4_WORD0_ACL;
|
||||||
}
|
}
|
||||||
|
info.owner = owner;
|
||||||
|
info.owner_group = group;
|
||||||
status = nfs41_getattr(state->session, &state->file, &attr_request, &info);
|
status = nfs41_getattr(state->session, &state->file, &attr_request, &info);
|
||||||
if (status) {
|
if (status) {
|
||||||
eprintf("handle_getacl: nfs41_cached_getattr() failed with %d\n",
|
eprintf("handle_getacl: nfs41_cached_getattr() failed with %d\n",
|
||||||
|
|
@ -727,7 +731,6 @@ static int handle_setacl(nfs41_upcall *upcall)
|
||||||
if (status)
|
if (status)
|
||||||
goto out;
|
goto out;
|
||||||
else {
|
else {
|
||||||
info.owner_len = (uint32_t)strlen(info.owner);
|
|
||||||
info.attrmask.arr[1] |= FATTR4_WORD1_OWNER;
|
info.attrmask.arr[1] |= FATTR4_WORD1_OWNER;
|
||||||
info.attrmask.count = 2;
|
info.attrmask.count = 2;
|
||||||
}
|
}
|
||||||
|
|
@ -745,7 +748,6 @@ static int handle_setacl(nfs41_upcall *upcall)
|
||||||
if (status)
|
if (status)
|
||||||
goto out;
|
goto out;
|
||||||
else {
|
else {
|
||||||
info.owner_group_len = (uint32_t)strlen(info.owner_group);
|
|
||||||
info.attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
|
info.attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
|
||||||
info.attrmask.count = 2;
|
info.attrmask.count = 2;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,8 +98,7 @@ static void init_component_args(
|
||||||
| FATTR4_WORD0_FSID | FATTR4_WORD0_FILEID;
|
| FATTR4_WORD0_FSID | FATTR4_WORD0_FILEID;
|
||||||
args->attr_request.arr[1] = FATTR4_WORD1_MODE
|
args->attr_request.arr[1] = FATTR4_WORD1_MODE
|
||||||
| FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS
|
| FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS
|
||||||
| FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY |
|
| FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY;
|
||||||
FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
|
|
||||||
|
|
||||||
args->getrootattr.attr_request = &args->attr_request;
|
args->getrootattr.attr_request = &args->attr_request;
|
||||||
res->root.path = path;
|
res->root.path = path;
|
||||||
|
|
|
||||||
|
|
@ -1010,8 +1010,7 @@ void init_getattr_request(bitmap4 *attr_request)
|
||||||
FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_FILEID;
|
FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_FILEID;
|
||||||
attr_request->arr[1] = FATTR4_WORD1_NUMLINKS |
|
attr_request->arr[1] = FATTR4_WORD1_NUMLINKS |
|
||||||
FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE |
|
FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE |
|
||||||
FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE |
|
FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE;
|
||||||
FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
|
|
||||||
attr_request->arr[2] = 0;
|
attr_request->arr[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -226,10 +226,8 @@ typedef struct __nfs41_file_info {
|
||||||
bool_t symlink_dir;
|
bool_t symlink_dir;
|
||||||
bool_t symlink_support;
|
bool_t symlink_support;
|
||||||
bool_t link_support;
|
bool_t link_support;
|
||||||
char owner[NFS4_OPAQUE_LIMIT];
|
char *owner;
|
||||||
uint32_t owner_len;
|
char *owner_group;
|
||||||
char owner_group[NFS4_OPAQUE_LIMIT];
|
|
||||||
uint32_t owner_group_len;
|
|
||||||
uint32_t aclsupport;
|
uint32_t aclsupport;
|
||||||
} nfs41_file_info;
|
} nfs41_file_info;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1767,15 +1767,19 @@ static bool_t decode_file_attrs(
|
||||||
}
|
}
|
||||||
if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER) {
|
if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER) {
|
||||||
char *ptr = &info->owner[0];
|
char *ptr = &info->owner[0];
|
||||||
if (!xdr_bytes(xdr, &ptr, &info->owner_len,
|
uint32_t owner_len;
|
||||||
|
if (!xdr_bytes(xdr, &ptr, &owner_len,
|
||||||
NFS4_OPAQUE_LIMIT))
|
NFS4_OPAQUE_LIMIT))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
info->owner[owner_len] = '\0';
|
||||||
}
|
}
|
||||||
if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
|
if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
|
||||||
char *ptr = &info->owner_group[0];
|
char *ptr = &info->owner_group[0];
|
||||||
if (!xdr_bytes(xdr, &ptr, &info->owner_group_len,
|
uint32_t owner_group_len;
|
||||||
|
if (!xdr_bytes(xdr, &ptr, &owner_group_len,
|
||||||
NFS4_OPAQUE_LIMIT))
|
NFS4_OPAQUE_LIMIT))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
info->owner_group[owner_group_len] = '\0';
|
||||||
}
|
}
|
||||||
if (attrs->attrmask.arr[1] & FATTR4_WORD1_SPACE_AVAIL) {
|
if (attrs->attrmask.arr[1] & FATTR4_WORD1_SPACE_AVAIL) {
|
||||||
if (!xdr_u_hyper(xdr, &info->space_avail))
|
if (!xdr_u_hyper(xdr, &info->space_avail))
|
||||||
|
|
@ -2573,14 +2577,16 @@ static bool_t encode_file_attrs(
|
||||||
}
|
}
|
||||||
if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER) {
|
if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER) {
|
||||||
char *ptr = &info->owner[0];
|
char *ptr = &info->owner[0];
|
||||||
if (!xdr_bytes(&localxdr, &ptr, &info->owner_len,
|
uint32_t owner_len = strlen(info->owner);
|
||||||
|
if (!xdr_bytes(&localxdr, &ptr, &owner_len,
|
||||||
NFS4_OPAQUE_LIMIT))
|
NFS4_OPAQUE_LIMIT))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER;
|
attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER;
|
||||||
}
|
}
|
||||||
if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
|
if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
|
||||||
char *ptr = &info->owner_group[0];
|
char *ptr = &info->owner_group[0];
|
||||||
if (!xdr_bytes(&localxdr, &ptr, &info->owner_group_len,
|
uint32_t owner_group_len = strlen(info->owner_group);
|
||||||
|
if (!xdr_bytes(&localxdr, &ptr, &owner_group_len,
|
||||||
NFS4_OPAQUE_LIMIT))
|
NFS4_OPAQUE_LIMIT))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
|
attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue