From 24c9de5d11d5d1145da96a2af52dd22d81e0c89d Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Wed, 16 Aug 2017 10:20:11 -0700 Subject: [PATCH] client: clear suid/sgid bits on non-zero write According to [1], these bits should be cleared regardless of any exe bits on the file. Also, add the required non-zero write check. [1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html Signed-off-by: Patrick Donnelly --- src/client/Client.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 57081a9e4455d..eb62132a17164 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -9018,8 +9018,7 @@ int Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf, return r; /* clear the setuid/setgid bits, if any */ - if (unlikely((in->mode & S_ISUID) || - (in->mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))) { + if (unlikely(in->mode & (S_ISUID|S_ISGID)) && size > 0) { struct ceph_statx stx = { 0 }; put_cap_ref(in, CEPH_CAP_AUTH_SHARED); -- 2.39.5