Bug 14162

Summary: Падает с setgroups(): Operation not permitted
Product: Sisyphus Reporter: Evgenii Terechkov <evg>
Component: fprobe-ulogAssignee: Nobody's working on this, feel free to take it <nobody>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: critical    
Priority: P2    
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
patch and spec none

Description Evgenii Terechkov 2008-01-25 18:06:50 MSK
* Воскресенье 20 января 2008 Евгений Терешков

> Alexey Borovskoy пишет:
> > Добрый вечер.
> >
> > Понадобилось собрать netflow с компа.
> > Взял fprobe-ulog, а он падает вот так.
>
> У меня вроде работает.
>
> > Jan 20 20:38:31 alb fprobe-ulog[9063]: [INFO]: Starting
> > 1.1... Jan 20 20:38:31 alb fprobe-ulog: fprobe-ulog startup
> > succeeded Jan 20 20:38:31 alb fprobe-ulog[9063]: [CRIT]:
> > setgroups(): Operation not permitted
> > Что крутить, как лечить.
>
> Посмотреть вывод rpm -V fprobe-ulog, взять изменения конфигов.
>
> Увеличить уровень отладки, посмотреть, может что ещё в логе
> появится.
>
> Снять отладку с помощью strace, воспроизведя падение
> (возможно, поигравшись с ключами ком-строки). Повесить багу,
> указав там всю полученную информацию. Попробую почитать код,
> выяснить, что где криво.
>
> > Какие еще есть сенсоры, которые собирают данные через
> > iptables?
>
> Не знаю. ИМХО, в Сизифе больше нет.

Из переписки с vsu@

void setuser() {
        /*
        Workaround for clone()-based threads
        Try to change EUID independently of main thread
        */
        if (pw) {       
                setgroups(0, NULL);
                setregid(pw->pw_gid, pw->pw_gid);
                setreuid(pw->pw_uid, pw->pw_uid);
        }
}

);
        }
}

[23:59]<Сергей Власов> возможно, это стало лишним
[00:11]<Сергей Власов> хотя вроде бы ничего не менялось
[00:38]<Сергей Власов> нашёл
[00:38]<Сергей Власов> __libc_pthread_functions.ptr__nptl_setxid
[00:38]<Сергей Власов> но тогда получается, что сломалось очень 
давно
[00:38]<Сергей Власов> с переходом на NPTL
[00:40]<Сергей Власов> фигня вот в чём
[00:40]<Сергей Власов> когда-то давно в качестве libpthread 
использовали linuxthreads
[00:41]<Сергей Власов> там с seteuid() и т.п. ничего не делалось
[00:41]<Сергей Власов> просто напрямую сваливалось в системные 
вызовы
[00:41]<Сергей Власов> и эти вызовы действовали только на текущий 
поток
[00:42]<Сергей Власов> однако в POSIX записано, что они должны 
действовать на весь процесс
[00:42]<Сергей Власов> в NPTL, среди прочего, пофиксили и это
[00:42]<Сергей Власов> правда, каким-то очень извратным методом
[00:43]<Сергей Власов> если в одном потоке выполняется set*id, он 
посылает сигнал всем другим потокам, чтобы они тоже выполнили 
эту операцию
[00:43]<Сергей Власов> в результате тот изврат в setuser() стал 
вроде бы не нужен
[00:44]<Сергей Власов> и теперь, видимо, какой-то поток успевает 
выполнить setreuid() раньше главного
[00:44]<Сергей Власов> на самом деле просто убирать тоже 
неправильно
[00:44]<Сергей Власов> нужно добавлять синхронизацию
[00:44]<Сергей Власов> чтобы сначала главный поток сделал 
setreuid(), и только после этого остальные куда-то лезли
[00:45]<Сергей Власов> в принципе можно тогда сохранить там и 
повторный setreuid() без проверки - на случай сборки этого кода 
на чём-то древнем
[00:49]<Сергей Власов> весь этот изврат там из-за того, что 
создавать потоки нужно с рутовыми правами, чтобы использовать 
SCHED_FIFO
[00:52]<Сергей Власов> кривохак - usleep(100000) в setuser()
[00:54]<Сергей Власов> если делать правильно - либо 
pthread_barrier, либо городить изврат с pthread_cond


Actual Results:  
Crash

Expected Results:  
Work
Comment 1 Sergey Bolshakov 2008-09-01 20:45:09 MSD
Created attachment 2870 [details]
patch and spec

патчъ, убирающий ненужные вызовы setuser()
и спек (применить по вкусу)
Comment 2 Evgenii Terechkov 2008-09-04 19:19:00 MSD
Try 1.1-alt4