Я читал man
страницу chown
. Я не понимаю, почему S_ISUID
и S_ISGID
режим должен быть очищен, когда функция возвращается успешно.
решение1
Я думаю, вы ссылаетесь на эту страницу руководства:
Когда владелец или группа исполняемого файла изменяются непривилегированным пользователем, биты режима S_ISUID и S_ISGID очищаются.
Так почему же они сейчас очищены? Видите ли, они очищаются только в случаеисполняемыйfile. Потому что когда один из битов (SUID/SGID) установлен, непривилегированный пользователь может выполнить файл как новый владелец файла. Это было бы огромной брешью в безопасности.
решение2
Я думаю, вы неправильно поняли man 2 chown
:тыне нужно очищать S_ISUID
и S_ISGID
, они будут автоматически очищены, когда вы используете эту функцию как непривилегированный пользователь. Если ваша программа работает как root
поведение (в Linux) зависит от версии ядра.
Если вам необходимо установить биты, просто примените их повторно (при условии, что учетная запись, которая пытается их установить, имеет соответствующие права).
Из страницы руководства:
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.
POSIX does not specify whether this also should happen when root does
the chown(); the Linux behavior depends on the kernel version. In
case of a non-group-executable file (i.e., one for which the S_IXGRP
bit is not set) the S_ISGID bit indicates mandatory locking, and is
not cleared by a chown().