From 316dfe568ac1e633ad8bcc51c2ac65cc5912324f Mon Sep 17 00:00:00 2001 From: Olga Kornievskaia Date: Mon, 18 Jul 2011 14:21:29 -0400 Subject: [PATCH] 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. --- daemon/acl.c | 10 ++++++---- daemon/lookup.c | 3 +-- daemon/nfs41_ops.c | 3 +-- daemon/nfs41_types.h | 6 ++---- daemon/nfs41_xdr.c | 14 ++++++++++---- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/daemon/acl.c b/daemon/acl.c index 21fb67d..1d7a036 100644 --- a/daemon/acl.c +++ b/daemon/acl.c @@ -269,17 +269,19 @@ static int handle_getacl(nfs41_upcall *upcall) getacl_upcall_args *args = &upcall->args.getacl; nfs41_open_state *state = upcall->state_ref; nfs41_file_info info; - bitmap4 attr_request; + bitmap4 attr_request = { 0 }; LPSTR domain = NULL; SECURITY_DESCRIPTOR sec_desc; PACL dacl = NULL; PSID *sids = NULL; PSID osid = NULL, gsid = NULL; DWORD sid_len; + char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT]; // need to cache owner/group information XX 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) { info.acl = calloc(1, sizeof(nfsacl41)); if (info.acl == NULL) { @@ -288,6 +290,8 @@ static int handle_getacl(nfs41_upcall *upcall) } attr_request.arr[0] |= FATTR4_WORD0_ACL; } + info.owner = owner; + info.owner_group = group; status = nfs41_getattr(state->session, &state->file, &attr_request, &info); if (status) { eprintf("handle_getacl: nfs41_cached_getattr() failed with %d\n", @@ -727,7 +731,6 @@ static int handle_setacl(nfs41_upcall *upcall) if (status) goto out; else { - info.owner_len = (uint32_t)strlen(info.owner); info.attrmask.arr[1] |= FATTR4_WORD1_OWNER; info.attrmask.count = 2; } @@ -745,7 +748,6 @@ static int handle_setacl(nfs41_upcall *upcall) if (status) goto out; else { - info.owner_group_len = (uint32_t)strlen(info.owner_group); info.attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP; info.attrmask.count = 2; } diff --git a/daemon/lookup.c b/daemon/lookup.c index 406cca8..df06b67 100644 --- a/daemon/lookup.c +++ b/daemon/lookup.c @@ -98,8 +98,7 @@ static void init_component_args( | FATTR4_WORD0_FSID | FATTR4_WORD0_FILEID; args->attr_request.arr[1] = FATTR4_WORD1_MODE | FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS - | FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY | - FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP; + | FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY; args->getrootattr.attr_request = &args->attr_request; res->root.path = path; diff --git a/daemon/nfs41_ops.c b/daemon/nfs41_ops.c index 5a2e582..fddc0c1 100644 --- a/daemon/nfs41_ops.c +++ b/daemon/nfs41_ops.c @@ -1010,8 +1010,7 @@ void init_getattr_request(bitmap4 *attr_request) FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_FILEID; attr_request->arr[1] = FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE | - FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE | - FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP; + FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE; attr_request->arr[2] = 0; } diff --git a/daemon/nfs41_types.h b/daemon/nfs41_types.h index 57851fd..a6792b0 100644 --- a/daemon/nfs41_types.h +++ b/daemon/nfs41_types.h @@ -226,10 +226,8 @@ typedef struct __nfs41_file_info { bool_t symlink_dir; bool_t symlink_support; bool_t link_support; - char owner[NFS4_OPAQUE_LIMIT]; - uint32_t owner_len; - char owner_group[NFS4_OPAQUE_LIMIT]; - uint32_t owner_group_len; + char *owner; + char *owner_group; uint32_t aclsupport; } nfs41_file_info; diff --git a/daemon/nfs41_xdr.c b/daemon/nfs41_xdr.c index 9857586..f44dc55 100644 --- a/daemon/nfs41_xdr.c +++ b/daemon/nfs41_xdr.c @@ -1767,15 +1767,19 @@ static bool_t decode_file_attrs( } if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER) { 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)) return FALSE; + info->owner[owner_len] = '\0'; } if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) { 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)) return FALSE; + info->owner_group[owner_group_len] = '\0'; } if (attrs->attrmask.arr[1] & FATTR4_WORD1_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) { 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)) return FALSE; attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER; } if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) { 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)) return FALSE; attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;