# [PATCH] adjust_shared_perm(): leave g+s alone when the group does not matter

5 messages from 2022-10-28 to 2022-10-28. Participants: Junio C Hamano, brian m. carlson.
Thread: https://gitlist.dev/t/58709

## Junio C Hamano, 2022-10-28 21:16

Subject: [PATCH] adjust_shared_perm(): leave g+s alone when the group does not matter
Message-ID: <xmqqr0yrhco6.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqr0yrhco6.fsf%40gitster.g

```
Julien Moutinho reports that in an environment where directory does
not have BSD group semantics and requires g+s (aka FORCE_DIR_SET_GID)
but the system cripples chmod() to forbid g+s, adjust_shared_perm()
fails even when the repository is for private use with perm = 0600.

When we grant extra access based on group membership (i.e. the
directory has either g+r or g+w bit set), which group the directory
and its contents are owned by matters.  But otherwise (e.g. perm is
set to 0600, in Julien's case), flipping g+s bit is not necessary.

Reported-by: Julien Moutinho <julm+git@sourcephile.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 path.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/path.c b/path.c
index a3cfcd8a6e..492e17ad12 100644
--- a/path.c
+++ b/path.c
@@ -901,7 +901,13 @@ int adjust_shared_perm(const char *path)
 	if (S_ISDIR(old_mode)) {
 		/* Copy read bits to execute bits */
 		new_mode |= (new_mode & 0444) >> 2;
-		new_mode |= FORCE_DIR_SET_GID;
+
+		/*
+		 * g+s matters only if any extra access is granted
+		 * based on group membership.
+		 */
+		if (FORCE_DIR_SET_GID && (new_mode & 060))
+			new_mode |= FORCE_DIR_SET_GID;
 	}
 
 	if (((old_mode ^ new_mode) & ~S_IFMT) &&
-- 
2.38.1-280-g63bba4fdd8


```

## brian m. carlson, 2022-10-28 21:46

Subject: Re: [PATCH] adjust_shared_perm(): leave g+s alone when the group does not matter
Message-ID: <Y1xNrDB10XEcAa0d@tapette.crustytoothpaste.net>
URL: https://gitlist.dev/e/Y1xNrDB10XEcAa0d%40tapette.crustytoothpaste.net
In-Reply-To: <xmqqr0yrhco6.fsf@gitster.g>

```
On 2022-10-28 at 21:16:09, Junio C Hamano wrote:
> Julien Moutinho reports that in an environment where directory does
> not have BSD group semantics and requires g+s (aka FORCE_DIR_SET_GID)
> but the system cripples chmod() to forbid g+s, adjust_shared_perm()

I would personally use a different verb here because I have the
impression it's offensive, at least when used as a noun.  Perhaps
"limit" or "restrict" might be more neutral, or we could pick another
verb which expresses our displeasure at this design (maybe "impair"?)
but maybe is less likely to be emotionally charged or offend.

> fails even when the repository is for private use with perm = 0600.
> 
> When we grant extra access based on group membership (i.e. the
> directory has either g+r or g+w bit set), which group the directory
> and its contents are owned by matters.  But otherwise (e.g. perm is
> set to 0600, in Julien's case), flipping g+s bit is not necessary.

Except for my comment above, I think the patch here addresses the
proposed issue and looks good, and as usual, is well explained.
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

```

## Junio C Hamano, 2022-10-28 21:51

Subject: Re: [PATCH] adjust_shared_perm(): leave g+s alone when the group does not matter
Message-ID: <xmqqbkpvhb0x.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqbkpvhb0x.fsf%40gitster.g
In-Reply-To: <Y1xNrDB10XEcAa0d@tapette.crustytoothpaste.net>

```
"brian m. carlson" <sandals@crustytoothpaste.net> writes:

> On 2022-10-28 at 21:16:09, Junio C Hamano wrote:
>> Julien Moutinho reports that in an environment where directory does
>> not have BSD group semantics and requires g+s (aka FORCE_DIR_SET_GID)
>> but the system cripples chmod() to forbid g+s, adjust_shared_perm()
>
> I would personally use a different verb here because I have the
> impression it's offensive, at least when used as a noun.  Perhaps
> "limit" or "restrict" might be more neutral, or we could pick another
> verb which expresses our displeasure at this design (maybe "impair"?)
> but maybe is less likely to be emotionally charged or offend.

castrates? butchers?

tweaks?  That's quite neutral.


```

## brian m. carlson, 2022-10-28 22:21

Subject: Re: [PATCH] adjust_shared_perm(): leave g+s alone when the group does not matter
Message-ID: <Y1xWBiZUAbPmt71W@tapette.crustytoothpaste.net>
URL: https://gitlist.dev/e/Y1xWBiZUAbPmt71W%40tapette.crustytoothpaste.net
In-Reply-To: <xmqqbkpvhb0x.fsf@gitster.g>

```
On 2022-10-28 at 21:51:42, Junio C Hamano wrote:
> "brian m. carlson" <sandals@crustytoothpaste.net> writes:
> 
> > On 2022-10-28 at 21:16:09, Junio C Hamano wrote:
> >> Julien Moutinho reports that in an environment where directory does
> >> not have BSD group semantics and requires g+s (aka FORCE_DIR_SET_GID)
> >> but the system cripples chmod() to forbid g+s, adjust_shared_perm()
> >
> > I would personally use a different verb here because I have the
> > impression it's offensive, at least when used as a noun.  Perhaps
> > "limit" or "restrict" might be more neutral, or we could pick another
> > verb which expresses our displeasure at this design (maybe "impair"?)
> > but maybe is less likely to be emotionally charged or offend.
> 
> castrates? butchers?
> 
> tweaks?  That's quite neutral.

I think "butchers" or "tweaks" should be fine.  I might say "modifies"
as well.
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

```

## Junio C Hamano, 2022-10-28 22:49

Subject: Re: [PATCH] adjust_shared_perm(): leave g+s alone when the group does not matter
Message-ID: <xmqq5yg3ftri.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqq5yg3ftri.fsf%40gitster.g
In-Reply-To: <Y1xWBiZUAbPmt71W@tapette.crustytoothpaste.net>

```
"brian m. carlson" <sandals@crustytoothpaste.net> writes:

> On 2022-10-28 at 21:51:42, Junio C Hamano wrote:
>> "brian m. carlson" <sandals@crustytoothpaste.net> writes:
>> 
>> > On 2022-10-28 at 21:16:09, Junio C Hamano wrote:
>> >> Julien Moutinho reports that in an environment where directory does
>> >> not have BSD group semantics and requires g+s (aka FORCE_DIR_SET_GID)
>> >> but the system cripples chmod() to forbid g+s, adjust_shared_perm()
>> >
>> > I would personally use a different verb here because I have the
>> > impression it's offensive, at least when used as a noun.  Perhaps
>> > "limit" or "restrict" might be more neutral, or we could pick another
>> > verb which expresses our displeasure at this design (maybe "impair"?)
>> > but maybe is less likely to be emotionally charged or offend.
>> 
>> castrates? butchers?
>> 
>> tweaks?  That's quite neutral.
>
> I think "butchers" or "tweaks" should be fine.  I might say "modifies"
> as well.

I've decided to weaken it a lot by phrasing it like so:

    ... but the system forbids chmod() to touch the g+s bit, ...




```
