2022-08-11 20:18:21

by Kenneth Dsouza

[permalink] [raw]
Subject: [PATCH v2] libnfs4acl: Check file mode before getxattr call

Currently we are checking file mode after getxattr call.
Due to this the return value would be 0, which would change the getxattr return value.
As xattr_size will be 0, nfs4_getfacl will fail with error EINVAL.
This patch fixes this issue by moving the file mode check before
getxattr call.

Signed-off-by: Kenneth D'souza <[email protected]>
---
libnfs4acl/nfs4_getacl.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/libnfs4acl/nfs4_getacl.c b/libnfs4acl/nfs4_getacl.c
index 7821da3..aace5cd 100644
--- a/libnfs4acl/nfs4_getacl.c
+++ b/libnfs4acl/nfs4_getacl.c
@@ -39,6 +39,13 @@ static struct nfs4_acl *nfs4_getacl_byname(const char *path,
return NULL;
}

+ ret = stat(path, &st);
+ if (ret == -1)
+ goto err;
+
+ if (S_ISDIR(st.st_mode))
+ iflags = NFS4_ACL_ISDIR;
+
/* find necessary buffer size */
ret = getxattr(path, xattr_name, NULL, 0);
if (ret == -1)
@@ -53,13 +60,6 @@ static struct nfs4_acl *nfs4_getacl_byname(const char *path,
if (ret == -1)
goto err_free;

- ret = stat(path, &st);
- if (ret == -1)
- goto err_free;
-
- if (S_ISDIR(st.st_mode))
- iflags = NFS4_ACL_ISDIR;
-
acl = acl_nfs41_xattr_load(buf, ret, iflags, type);

free(buf);
--
2.31.1


2022-09-12 18:26:32

by Kenneth Dsouza

[permalink] [raw]
Subject: Re: [PATCH v2] libnfs4acl: Check file mode before getxattr call

ping

On Fri, Aug 12, 2022 at 1:19 AM Kenneth D'souza <[email protected]> wrote:
>
> Currently we are checking file mode after getxattr call.
> Due to this the return value would be 0, which would change the getxattr return value.
> As xattr_size will be 0, nfs4_getfacl will fail with error EINVAL.
> This patch fixes this issue by moving the file mode check before
> getxattr call.
>
> Signed-off-by: Kenneth D'souza <[email protected]>
> ---
> libnfs4acl/nfs4_getacl.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/libnfs4acl/nfs4_getacl.c b/libnfs4acl/nfs4_getacl.c
> index 7821da3..aace5cd 100644
> --- a/libnfs4acl/nfs4_getacl.c
> +++ b/libnfs4acl/nfs4_getacl.c
> @@ -39,6 +39,13 @@ static struct nfs4_acl *nfs4_getacl_byname(const char *path,
> return NULL;
> }
>
> + ret = stat(path, &st);
> + if (ret == -1)
> + goto err;
> +
> + if (S_ISDIR(st.st_mode))
> + iflags = NFS4_ACL_ISDIR;
> +
> /* find necessary buffer size */
> ret = getxattr(path, xattr_name, NULL, 0);
> if (ret == -1)
> @@ -53,13 +60,6 @@ static struct nfs4_acl *nfs4_getacl_byname(const char *path,
> if (ret == -1)
> goto err_free;
>
> - ret = stat(path, &st);
> - if (ret == -1)
> - goto err_free;
> -
> - if (S_ISDIR(st.st_mode))
> - iflags = NFS4_ACL_ISDIR;
> -
> acl = acl_nfs41_xattr_load(buf, ret, iflags, type);
>
> free(buf);
> --
> 2.31.1
>

2022-09-13 16:52:59

by Steve Dickson

[permalink] [raw]
Subject: Re: [PATCH v2] libnfs4acl: Check file mode before getxattr call



On 9/12/22 2:24 PM, Kenneth Dsouza wrote:
> ping
Sorry about that... Thanks for the ping!

>
> On Fri, Aug 12, 2022 at 1:19 AM Kenneth D'souza <[email protected]> wrote:
>>
>> Currently we are checking file mode after getxattr call.
>> Due to this the return value would be 0, which would change the getxattr return value.
>> As xattr_size will be 0, nfs4_getfacl will fail with error EINVAL.
>> This patch fixes this issue by moving the file mode check before
>> getxattr call.
>>
>> Signed-off-by: Kenneth D'souza <[email protected]>
Committed... (tag: nfs4-acl-tools-0.4.1-rc2)

steved.
>> ---
>> libnfs4acl/nfs4_getacl.c | 14 +++++++-------
>> 1 file changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/libnfs4acl/nfs4_getacl.c b/libnfs4acl/nfs4_getacl.c
>> index 7821da3..aace5cd 100644
>> --- a/libnfs4acl/nfs4_getacl.c
>> +++ b/libnfs4acl/nfs4_getacl.c
>> @@ -39,6 +39,13 @@ static struct nfs4_acl *nfs4_getacl_byname(const char *path,
>> return NULL;
>> }
>>
>> + ret = stat(path, &st);
>> + if (ret == -1)
>> + goto err;
>> +
>> + if (S_ISDIR(st.st_mode))
>> + iflags = NFS4_ACL_ISDIR;
>> +
>> /* find necessary buffer size */
>> ret = getxattr(path, xattr_name, NULL, 0);
>> if (ret == -1)
>> @@ -53,13 +60,6 @@ static struct nfs4_acl *nfs4_getacl_byname(const char *path,
>> if (ret == -1)
>> goto err_free;
>>
>> - ret = stat(path, &st);
>> - if (ret == -1)
>> - goto err_free;
>> -
>> - if (S_ISDIR(st.st_mode))
>> - iflags = NFS4_ACL_ISDIR;
>> -
>> acl = acl_nfs41_xattr_load(buf, ret, iflags, type);
>>
>> free(buf);
>> --
>> 2.31.1
>>
>