SETFSGID(2) | Руководство программиста Linux | SETFSGID(2) |
setfsgid - устанавливает идентификатор группы для доступа к файловой системе
#include <sys/fsuid.h>
int setfsgid(uid_t fsgid);
В Linux у процесса есть идентификатор группы файловой системы и эффективный (effective) идентификатор группы. Идентификатор группы файловой системы (есть только в Linux) используется при проверки прав доступа к объектам файловой системы, а эффективный идентификатор группы используется для проверки прав доступа к другим различным объектам (смотрите credentials(7)).
Обычно, значение идентификатора группы файловой системы процесса совпадает со значением эффективного идентификатора группы. Более того, при изменении идентификатора эффективного идентификатора группы ядро также изменяет и идентификатор группы файловой системы на новое значение идентификатора эффективного идентификатора группы.Процесс может изменить значение своего идентификатора группы файловой системы на отличное от эффективного идентификатора группы с помощью setfsgid() указав его в параметре fsgid.
Вызов setfsgid() выполняется корректно, только если он был вызван суперпользователем или, если fsgid совпадает с идентификатором действительной, эффективной и сохранённой группы или равен текущему значению идентификатора пользователя файловой системы вызывающего.
При успешном выполнении или при ошибке данный вызов возвращает предыдущий идентификатор группы файловой системы вызвавшего.
Данный системный вызов доступен в Linux начиная с версии 1.2.
Вызов setfsgid() есть только в Linux и не должен использоваться в переносимых программах.
Понятие идентификатора группы файловой системы и системный вызов setfsgid() были изобретены по историческим причинам, которые больше не применимы к современным ядрам Linux. Смотрите в описании setfsuid(2) почему в использовании setfsuid(2) и setfsgid() теперь нет необходимости.
Первоначальная версия системного вызова Linux setfsgid() поддерживала только 16-битные идентификаторы групп. Позднее в Linux 2.4 был добавлен setfsgid32(), поддерживающий 32-битные идентификаторы. Обёрточная функция glibc setfsgid() скрывает это различие в версиях ядер.
В glibc 2.15 и старее, если обёрточная функция этого системного вызова определяет, что аргумент невозможно передать ядру без обрезания целого (так как ядро старое и не поддерживает 32-битные ID группы), то она возвращает -1 и присваивает errno значение EINVAL не пытаясь выполнить системный вызов.
Вызывающему не возвращается никаких ошибок, и факт того, что успешном или не успешном выполнении возвращается одинаковое значение, делает невозможным напрямую определить как завершился вызов. Вместо этого, вызывающий должен получить значение из ещё одного вызова — setfsgid(-1) (который всегда завершается с ошибкой), чтобы определить, изменил ли предыдущий вызов setfsgid() идентификатор группы файловой системы. По крайней мере, должно быть получено значение EPERM, если вызов завершится с ошибкой (так как у вызывающего нет мандата CAP_SETGID).
2017-09-15 | Linux |