Re: [PATCH] NFSv4.2: request mode after CLONE

"Chuck Lever" <[email protected]>
Newsgroups org.kernel.vger.linux-nfs,org.kernel.vger.linux-kernel
Message-ID <[email protected]>

On Wed, Aug 12, 2026, at 2:25 AM, Cedric Blancher wrote:
> On Sun, 2 Aug 2026 at 21:58, Felix Hoffmann <[email protected]> wrote:
>>
>> The NFS server can clear setuid and setgid bits when CLONE modifies the
>> destination.  The client currently omits mode from the post-operation
>> attributes, so the cached mode can retain setid bits after the server has
>> removed them.  A local process can then execute the file using those stale
>> privilege bits.
>>
>> Request mode in the CLONE compound's GETATTR.  This lets the ordered
>> post-operation update install the server's mode before CLONE returns.
>>
>> Fixes: e5341f3a5762 ("nfs42: add CLONE proc functions")
>> Cc: [email protected]
>> Assisted-by: Codex:gpt-5
>> Signed-off-by: Felix Hoffmann <[email protected]>
>> ---
>> Tested on x86-64 using an NFSv4.2 loopback mount with Linux NFSD and a
>> Btrfs export:
>>
>>   - before this change, the client retained mode 04775 while the server
>>     stored mode 0775, and the privilege transition reproduced in 10/10
>>     non-debug runs
>>   - with this change, both client and server reported mode 0775 and no
>>     privilege transition occurred in 10/10 non-debug runs or 3/3 KASAN
>>     runs
>>
>> The reproducer requires write authorization to the destination; NFSD
>> rejected the same operation against a non-writable 04755 file with EACCES.
>> A working reproducer is available privately on request.
>>
>>  fs/nfs/nfs42proc.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
>> index ab86246fc364..35a4909d51b7 100644
>> --- a/fs/nfs/nfs42proc.c
>> +++ b/fs/nfs/nfs42proc.c
>> @@ -1302,7 +1302,8 @@ static int _nfs42_proc_clone(struct rpc_message *msg, struct file *src_f,
>>                 return -ENOMEM;
>>
>>         nfs4_bitmask_set(dst_bitmask, server->cache_consistency_bitmask,
>> -                        dst_inode, NFS_INO_INVALID_BLOCKS);
>> +                        dst_inode,
>> +                        NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_MODE);
>>
>>         status = nfs4_call_sync(server->client, server, msg,
>>                                 &args.seq_args, &res.seq_res, 0);
>
> Chuck, what do you think? Does this apply only to NFS CLONE, or to NFS COPY too?

Responding since you asked me directly, but I don't have a
considered opinion about this. Just some advice: the OP
provided a reproducer, you could try that and see. Naively
I would expect it might apply to COPY.

-- 
Chuck Lever
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.