LINUX.ORG.RU

вопрос о правах доступа.


0

0

вопрос о правах доступа.
язык СИ.
ОС UNIX.

Пытаюсь написать прогрмму, которая должна
корректно работать с правами доступа к файлам (ftp-сервер).
Не получается, и не могу понять почему.

краткое содержание:

//--- родительский процесс (root) ---

pid=fork();

if(pid==0){

//--- "дерутизация" ---

pwd=getpwnam(user);
gid=pwd->pw_gid;
uid=pwd->pw_uid;
n=setgid(gid);
n=setuid(uid);

//--- здесь тестовая распечатка ---
//--- uid, gid, euid, egid - всё как ожидалось (user) ---

fp=fopen(file,"r");

//--- ожидал, что файл будет доступен или недоступен
// в соответствии с правами user ---

//--- обработка файла ---

exit(0);

}

Вопреки ожиданиям, программа работает так:

исходный родительский процесс:
uid=0; gid=0

процесс после форк и дерутизации:
uid=1002; gid=1002
euid=1002; egid=1002

Варианты файла:
файл: uid=1004; gid=1004 - работает как ожидалось, т. е. на правах других пользователей.

файл: uid=1001; gid=0 - работает как если бы процесс имел gid=0, т. е. на правах группы.


Кто знает прошу ответить.


Ответ на: комментарий от ananas

подтверждение этому в том, что при входе в PUTTy под user'ом доступ к этим же файлам не на правах группы.

oleg_2
() автор топика

Возвращаемое значение у getpwnam надо проверять.

true_admin ★★★★★
()

диагноз: незнание предмета.
лечение: читать Робачевского "Операционная система Unix", глава "Владельцы файлов" (с.28).

xydo ★★
()
Ответ на: комментарий от xydo

Спасибо всем.

Ответ (в неявном виде) нашелся здесь на форуме. В разделе программирование и разработка ПО под Linux/Unix в теме core dump - не сохраняется корка (stpg).

Правильный ответ: Процессу придан список дополнительных групп пользователей. Вызов n=setgid(gid); устанавливает группу процесса, но список остается. Помогло применение функции k=setgroups(0,gr_list); который способен опустошить этот список.

Теперь работает согласно замыслу. user'а тоже надо снабдить таким списком (если есть). Об этом я сразу не подумал. Ключ к решению есть.

Спасибо.

oleg_2
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.