* Воскресенье 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
Created attachment 2870 [details] patch and spec патчъ, убирающий ненужные вызовы setuser() и спек (применить по вкусу)
Try 1.1-alt4