quotas: Check group quota for directory when SGID is set
authorChristof Schmitt <cs@samba.org>
Tue, 13 Aug 2019 20:40:48 +0000 (13:40 -0700)
committerChristof Schmitt <cs@samba.org>
Wed, 14 Aug 2019 16:27:43 +0000 (16:27 +0000)
On directories with the "set group id" (SGID) bit is set, new files and
subfolders will be created with the group of the directory, and not with
the primary group of the user. Checking for free space in this case
should query the group quota for the gid of the directory.

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/smbd/quotas.c

index c9472682f8fe08541435a476ab0b56d8623e9008..604631f81d6d283680b5506aa88ce3bdc69f036f 100644 (file)
@@ -447,11 +447,26 @@ try_group_quota:
                return false;
        }
 
-       id.gid = getegid();
-
        ZERO_STRUCT(D);
-       r = SMB_VFS_GET_QUOTA(conn, fname, SMB_GROUP_QUOTA_TYPE, id,
-                             &D);
+
+       /*
+        * If new files created under this folder get this folder's
+        * GID, then available space is governed by the quota of the
+        * folder's GID, not the primary group of the creating user.
+        */
+       if (VALID_STAT(fname->st) &&
+           S_ISDIR(fname->st.st_ex_mode) &&
+           fname->st.st_ex_mode & S_ISGID) {
+               id.gid = fname->st.st_ex_gid;
+               become_root();
+               r = SMB_VFS_GET_QUOTA(conn, fname, SMB_GROUP_QUOTA_TYPE, id,
+                                     &D);
+               unbecome_root();
+       } else {
+               id.gid = getegid();
+               r = SMB_VFS_GET_QUOTA(conn, fname, SMB_GROUP_QUOTA_TYPE, id,
+                                     &D);
+       }
 
        if (r == -1) {
                return False;