diff --git a/daemon/lookup.c b/daemon/lookup.c index 06e6b04..420a6d0 100644 --- a/daemon/lookup.c +++ b/daemon/lookup.c @@ -98,7 +98,8 @@ 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_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY | + FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP; args->getrootattr.attr_request = &args->attr_request; res->root.path = path; diff --git a/daemon/nfs41_ops.c b/daemon/nfs41_ops.c index 59722fc..9cfdd14 100644 --- a/daemon/nfs41_ops.c +++ b/daemon/nfs41_ops.c @@ -1007,7 +1007,8 @@ void init_getattr_request(bitmap4 *attr_request) FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE; attr_request->arr[1] = FATTR4_WORD1_NUMLINKS | 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; } diff --git a/daemon/nfs41_types.h b/daemon/nfs41_types.h index 0072503..1cfd9a8 100644 --- a/daemon/nfs41_types.h +++ b/daemon/nfs41_types.h @@ -212,6 +212,10 @@ typedef struct __nfs41_file_info { bool_t symlink_dir; bool_t symlink_support; bool_t link_support; + unsigned char owner[NFS4_OPAQUE_LIMIT]; + uint32_t owner_len; + unsigned char owner_group[NFS4_OPAQUE_LIMIT]; + uint32_t owner_group_len; } nfs41_file_info; #endif /* !__NFS41_DAEMON_TYPES_H__ */ diff --git a/daemon/nfs41_xdr.c b/daemon/nfs41_xdr.c index 838b577..378fadd 100644 --- a/daemon/nfs41_xdr.c +++ b/daemon/nfs41_xdr.c @@ -1665,6 +1665,18 @@ static bool_t decode_file_attrs( if (!xdr_u_int32_t(xdr, &info->numlinks)) return FALSE; } + if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER) { + unsigned char *ptr = &info->owner[0]; + if (!xdr_bytes(xdr, &ptr, &info->owner_len, + NFS4_OPAQUE_LIMIT)) + return FALSE; + } + if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) { + unsigned char *ptr = &info->owner_group[0]; + if (!xdr_bytes(xdr, &ptr, &info->owner_group_len, + NFS4_OPAQUE_LIMIT)) + return FALSE; + } if (attrs->attrmask.arr[1] & FATTR4_WORD1_SPACE_AVAIL) { if (!xdr_u_hyper(xdr, &info->space_avail)) return FALSE; diff --git a/daemon/readdir.c b/daemon/readdir.c index 8abd2c7..dc95bca 100644 --- a/daemon/readdir.c +++ b/daemon/readdir.c @@ -489,13 +489,13 @@ static int handle_readdir(nfs41_upcall *upcall) } } - entry_buf = malloc(args->buf_len); + entry_buf = malloc(max(args->buf_len, 4096)); if (entry_buf == NULL) { status = GetLastError(); goto out_free_cookie; } fetch_entries: - entry_buf_len = args->buf_len; + entry_buf_len = max(args->buf_len, 4096); init_getattr_request(&attr_request); attr_request.arr[0] |= FATTR4_WORD0_RDATTR_ERROR;