New submission from Christopher Harrison <c...@sanger.ac.uk>:

The setgid bit is not set when creating a directory, even when explicitly 
specified in the mode argument, when its containing directory doesn't have its 
own setgid bit set. When the parent does have the setgid bit, it works as 
expected.

Steps to reproduce:

1. Outside of Python, create a working directory with mode 0770, such that:

   >>> from pathlib import Path
   >>> oct(Path().stat().st_mode)
   '0o40770'

2. Set the umask to 0, to be sure it's not a masking issue:

   >>> import os
   >>> _ = os.umask(0)

3. Create a subdirectory with mode ug+rwx,g+s (2770):

   >>> (test := Path("test")).mkdir(0o2770)
   >>> oct(test.stat().st_mode)
   '0o40770'

   Notice that setgid is not respected.

4. Set setgid to the working directory:

   >>> Path().chmod(0o2770)
   >>> oct(Path().stat().st_mode)
   '0o42770'

   This works as expected.

5. Create another subdirectory with mode ug+rwx,g+s:

   >>> (test2 := Path("test2")).mkdir(0o2770)
   >>> oct(test2.stat().st_mode)
   '0o42770'

   The setgid bit of the new directory is now correctly set.

This also affects os.mkdir.

I have only tested this under Python 3.8.2 and 3.8.3 on a POSIX filesystem. (I 
assume it's not relevant to non-POSIX filesystems.)

----------
components: Library (Lib)
messages: 374496
nosy: Xophmeister
priority: normal
severity: normal
status: open
title: Path.mkdir and os.mkdir don't respect setgid if its parent is g-s
versions: Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue41419>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to