Уязвимость позволяет удаленному пользователю с помощью специального ICMP пакета(содержащего опции record-route или timestamp) вызвать отказ в обслуживании.
> Могу сказать, что я вообще не знаю такого оператора =)
Так и я о чем говорю, когда нормально пишется код, то мне goto не нужен, причем не нарочно, а естественным образом не нужен. Становится нужен если надо срочно латать что-то.
> Так и я о чем говорю, когда нормально пишется код, то мне goto не
> нужен, причем не нарочно, а естественным образом не нужен.
> Становится нужен если надо срочно латать что-то.
Вообще, это такая обработка ошибок/обслуживание ресурсов. Я не ядреный программист,
но точно знаю, что в ядре куча кода типа
void some_func(int foo_handle, int bar_handle) {
int frob_value = INVALID_FROB;
lock(foo_handle);
if (!really_work(bar_handle)) {
goto release_foo;
}
lock(bar_handle);
if (turbo_murbo_activate(bar_handle) != RC_OK) {
goto release_locks;
}
if ((frob_value frobnicate_murbu_active(bar_handle)) == INVALID_FROB) {
goto desactivate_bar;
}
// do smth with frob_value;
desactivate_bar:
turbo_murbo_desactivate(bar_handle);
release_locks:
unlock(bar);
release_foo:
unlock(foo);
}
> Вообще, это такая обработка ошибок/обслуживание ресурсов
вот иманна, это, примерно, тоже самое, что try/catch. иначе пришлось бы лепить кучу if-ов, а зачастую еще и нехилой вложенностью. вот где мозги свернуть можно.
>Интересно, а по какой статье можно уволить админа, поставившего 2.6.* на производственный сервер?
ты лучше спроси по какой статье можно уволить админа, разрешившего "пинги" на производственный сервер? или вообще производственный сервер голой задницей в инет или в dmz с пингами? ;)
>ты лучше спроси по какой статье можно уволить админа, разрешившего "пинги" на производственный сервер? или вообще производственный сервер голой задницей в инет или в dmz с пингами? ;)
Это не оправдание например ping linux.org.ru работает и что волков боятся в лес не ходить давайте вообще тагда сервер из электричейкой розтки выключим так на всякий случай
>Это не оправдание например ping linux.org.ru работает и что волков боятся в лес не ходить давайте вообще тагда сервер из электричейкой розтки выключим так на всякий случай при чем тут оправдание?
> Так и я о чем говорю, когда нормально пишется код, то мне goto не нужен, причем не нарочно, а естественным образом не нужен.
goto пользуются программисты низкого уровня, когда язык программирования третьего поколения, типа си, используется ими, как высокоуровневый, "кроссплатформенный" ассемблер. :) Разумеется, среди таких будет много программеров дровов.
помню, года два назад любую циску можно было положить одним пакетом. многие до сих пор с этой бедой живут. посадят пионэра, который тупо ресетит рутер -- все дешевле, чем нанимать нормального сиськоведа. это общая беда ит-индустрии -- экономят, нанимая студентов, а потом пеняют на дырявость железа или софта. нет такой штуки, как абсолютная защита.
Оно конечно можно пинги отрезать, но больно ущербно это, прям как в анекдоте "купил мужик машину с правым рулем, все отлично и машина и музыка в ней и бар и компьтер навороченный, вот только маленький пустячок, когда он сплевывает, то все время в жену попадает"
Ну смотри. В той же винде. Чтобы скачать что-то с интернета через wininet, надо сначала WSAStartup, в случае удачи - InternetOpen, в случае удачи - InternetConnect, в случае удачи - InternetOpenUrl, в случае удачи - InternetReadFile. А потом ещё в обратной последовательности закрывать хэндлы. Ну что, делаем вложенные if, goto или что-то ещё? Предложи вариант. И не говори, что при программировании под линукс такого не бывает.
>Ну смотри. В той же винде. Чтобы скачать что-то с интернета через wininet, надо сначала WSAStartup, в случае удачи - InternetOpen, в случае удачи - InternetConnect, в случае удачи - InternetOpenUrl, в случае удачи - InternetReadFile.
Да-да. А в качестве сообщения об ошибке писать "Что-то не получилось, а что - хер знает. Кто-то из пяти". И потом, если не сработал InternetConnect, надо убить хендлы от WSAStartup и InternetOpen, но не убивать от остальных. И т.д.
>Это не оправдание например ping linux.org.ru работает и что волков >боятся в лес не ходить давайте вообще тагда сервер из электричейкой >розтки выключим так на всякий случай
chto to ya ne ponial , eto ping (icmp code 0 i 8 ) ili drugie icmp paketi ? nenado putat' odno s drugim , ping vesh' poleznaya , kak i nekotorie drugie vidi icmp messagev .
А что, в винде уже нельзя получить код ошибки? Или там если закроешь неоткрытый хендл случится что-то ужасное? И хендлы на открытость конечно не проверяются, я правильно понимаю?
В любом случае можно все нормально разрулить.
Когда у меня появляется много вложенных if-ов, я заново смотрю на метод --- и почему-то еще ни разу не было такого, что не удавалось привести его в божеский вид....
> А что, в винде уже нельзя получить код ошибки? Или там если закроешь неоткрытый хендл случится что-то ужасное?
Не знаю, как в винде - а в ядре наверняка. Особенно если это не opaque хендл, а указатель на структ функций, каковых полно. NULL->close() - это нихрена не хорошо. В низкоуровневом программировании (в ядре) задача управления ресурсами всегда падает на использователя этих ресурсов.
поэтому вместо if(get(a)) { if(get(b) { work(); release(b);} release(a);} пишут с goto. Потому как если ресурсов не 2, а, скажем, 4 или 6 - то само тело программы может уехать за правый край терминала...
> И хендлы на открытость конечно не проверяются, я правильно понимаю?
> Интересно, а по какой статье можно уволить админа, поставившего 2.6.* на производственный сервер?
Гы гы, хорошо сказал, Ссаныч. А давай так: я тебе даю ip сервера, выставленного в инет, icmp на firewall не блокируется, ядро 2.6.14.х, и даю сутки на то чтобы ты родил эксплоит к этой уязвимости и успешно его к этому серверу применил. А если не получится, мы на ЛОРе устроим конкурс на лучшую статью, по которой надо уволить Ссаныча. Устроит ?
Для статистики :)
kbps linux # grep -rw goto .|wc -l
35295
kbps linux # uname -a
Linux kbps 2.6.15-gentoo-r1 #1 SMP Mon Feb 6 20:28:00 VLAT 2006 i686 Intel(R) Pentium(R) 4 CPU 2.80GHz GenuineIntel GNU/Linux
А вот найдите 2 отличия:
Это в 2.4.32
if (ip_options_echo(&icmp_param.replyopts, skb_in))
goto ende;
...........
ende:
ip_rt_put(rt);
out:
icmp_xmit_unlock();
--------------------------------------------------------
А это уже 2.6.15
if (ip_options_echo(&icmp_param.replyopts, skb_in))
goto ende;
...............
ende:
ip_rt_put(rt);
out_unlock:
icmp_xmit_unlock();
Следует ли из этого, что 2.4.х также упадет по крайней мере также как и 2.6.х?
>>У тебя они вообще не варят, в C методов нету, учи матчасть.
>Глянь в зеркало, умник. Где в моей фразе "я не знаю такого оператора" ты увидел, что я пишу на С?
А ежели ты не на нем не пишешь, и даже не знаешь, как на нем структурная единица кода называется - фигли ж с "умными" мыслями вылезаешь? Да, на жаве и правда гото нечасто нужен (никогда, собственно говоря) - ну так на ней многопоточные ядра оперционных систем не каждый день пишут.
Создаёшь дополнительную структуру, желательно обобщённую, для обработки всех возможных критических ситуаций в своём ПО, используешь в ней указатели на вызываемые методы, хранишь статус завершения, ещё чего-нибудь, что требуется, в зависимости от особенностей ПО, в зависимости от статуса завершения производишь обработку критических и вообще, каких пожелаешь, ситуаций - сообщения, освобоздение и так далее..
> Писал я на С, писал.... и все равно goto нужен нечасто, если нормально проектировать функции.
Для ядра писал? Или встроенные системы? И без goto? Ну ты, блин, тогда либо велосипедист-фанатик, либо уникальный гений, создавший новый подход к проектированию. Во второе я что-то не очень верю - у таких людей обычно времени нет на форумах флеймить.
> Ты б еще сказал, с какого потолка ты сюда жаву приплел, мне было бы очень интересно....
А в каком еще более-менее популярном языке программирования нет функций, но есть методы? Или мсье дот-нет-программер?
> Хотя нет. Был бы ты адекватен --- можно было бы поговорить, а так....
Неадекватен - ты. Тебе уже показали, что во _всех_ ядрах используется похожий стиль управления ресурсами, с goto. И любой альтернативный вариант (вложенные if, try/catch на макросах, "освобождаем все подряд, проверяем валидность в функции освобождения") не выигрывает ни в компактности, ни в читабельности, ни в надежности. А ты - как попугай: "goto - ненужен, goto - костыль".
> а если завтра найдут дыру для remote exploit'a в ветке 2.х - тоже
> админы выноваты ?
Да ты че... За один только январь месяц во FreeBSD было найдено ЧЕТЫРЕ удаленные уязвимости с эксплойтами. Прикинь, сколько ща на паперти сидит старых бородатых пердунов с табличкой "will use freebsd for food"? :-)
>А в каком еще более-менее популярном языке программирования нет функций, но есть методы? Или мсье дот-нет-программер?
Итить.... Откуда взято "нет функций, но есть методы?" Откуда приплелся дотнет?
Или мсье не знает, что методы есть в C++? Или мсье думает, что "метод" --- это термин определенного языка, а не парадигмы программирования? Или мсье не подозревает, что C и C++ --- разные языки программирования?
Короче, разговаривать дальше смысла нет....
>А ты - как попугай: "goto - ненужен, goto - костыль"
>Да ты че... За один только январь месяц во FreeBSD было найдено >ЧЕТЫРЕ удаленные уязвимости с эксплойтами. Прикинь, сколько ща на >паперти сидит старых бородатых пердунов с табличкой >"will use freebsd for food"? :-)
Пиздобол ты мрачный. Нашли не 4 а 40 и не во фряхе а в линупсе!
> >А в каком еще более-менее популярном языке программирования нет функций, но есть методы? Или мсье дот-нет-программер?
> Итить.... Откуда взято "нет функций, но есть методы?" Откуда приплелся дотнет?
Упомянуть "проектирование методов" в контексте программирования в ядре может либо дурачок типа тебя, либо человек, отравленый Жавой. Ну либо шарпом.
> Или мсье не знает, что методы есть в C++? Или мсье думает, что "метод" --- это термин определенного языка, а не парадигмы программирования? Или мсье не подозревает, что C и C++ --- разные языки программирования?
Ты не поверишь, но я знаю еще и перл, JS, CL (плохо, учил-но-не-писал), и Haskell (см. common lisp). И термины знаю.
А вообще, изначальное мое сообщение имело смысл лишь "чувак, ты, видимо, слишком долго программировал не неправильных языках".
> > А ты - как попугай: "goto - ненужен, goto - костыль"
> Приведи хоть один пример, 3.14здобол....
Ты три или четыре раза заявлял "а я вот кульный программист, обхожусь без гото. Дураки это ядро программируют, наверное, если они не могут".
Или тебе пример необходимости goto? Дык кури исходники любой сетевой подсистемы любого ядра. Или любой встраиваемой операционки.