LINUX.ORG.RU

Найден 33-летний баг в коде yacc

 , , ,


0

0

Голландский программист Отто Моэрбик случайно нашёл баг в коде функции yyparse(), вскоре после написания собственного варианта malloc для OpenBSD. Николай Штурм первым обнаружил проблему, предположительно связанную с новым malloc, на платформе SPARC64 при попытке компиляции большого проекта на С++ с использованием новой версии malloc от Моэрбика, компилятор иногда завершается с сообщением о внутренней ошибке. После недолгого исследования оказалось, что при определённых условиях (создаваемых новой версией malloc) в функции yyparse происходит обращение к несуществующему элементу массива.

Выпущен соответствующий патч для OpenBSD, решающий данную проблему. Данный баг существует и в старых версиях UNIX вплоть до Sixth Edition UNIX, выпущенной в 1975 году.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Ответ на: комментарий от Gharik

>С учётом того, что в помянутых моментах аппаратной части платформы х86 всё сделано через задницу и совсем наоборот относительно нормальных RICS'ов - то логичен вывод, сынок, что оная х86 принципиально и от рождения является жутким глюкодромом. Что можно обойти лишь хорошей кармой, в частности - писать юникс под х86 и следовать юникс-вею, что блестяще доказывают линупс и гном и замечательно подтверждают аппаратно заточенные венды и прочие сопутствующие поделия на букву Кы с кармическим пенальти.

Каше (именно на К-) в голове гхарика наверняка даже чикатило позавидовал бы

black7
()

Вах! Вот это новость! Респект разработчикам OpenBSD!!!

php-coder ★★★★★
()
Ответ на: комментарий от anonymous

>После заключения договора о сотрудничестве со следствием, Отто Моэрбик согласился показать местонахождение 33-летнего бага.

:)))) Сильно! Жжоте, батенька!

php-coder ★★★★★
()
Ответ на: комментарий от anonymous

>После заключения договора о сотрудничестве со следствием, Отто Моэрбик согласился показать местонахождение 33-летнего бага.

за это ему пообщешали продлить скрок его жизни на 10 лет =)

hose
()
Ответ на: комментарий от seiken

>И необязательно автор бажного кода бездарь - просто он не расчитывал, что его код будет запускаться на какой-либо платформе, отличной от той, для которой он пишет.

Автор в этом случае именно бездрь или сделал ошибку (все ошибаются). потому как держать в голове только "архитектуру", на которой сидишь когда пишешь не на ассемблере для ОС, поддержиающей несколько архитектур - это быдлокодерство.

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

>Интересно, openbsd уже начал ктото использовать, что в ней начали дыры находить?

Как пользоваться, когда только аллокатор для неё пишут?:)

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

>Автор в этом случае именно бездрь или сделал ошибку (все ошибаются). потому как держать в голове только "архитектуру", на которой сидишь когда пишешь не на ассемблере для ОС, поддержиающей несколько архитектур - это быдлокодерство.

Ты знаешь, что будет завтра?

Yoda_The_Master
()
Ответ на: комментарий от random_code

ага, а 81-90 - девяностые, 91-00 - сотые.

жги ещё.

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

>Автор в этом случае именно бездрь или сделал ошибку (все ошибаются). потому как держать в голове только "архитектуру", на которой сидишь когда пишешь не на ассемблере для ОС, поддержиающей несколько архитектур - это быдлокодерство.

А сколько платформ поддерживала 6th Edition UNIX?

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

> типо дайошь типизированный, управляемый ассемблер?

> он уже существует, IL Asm называется, следи за новостями, красноглазик

Мда, дот.нет реально съедает мозг (а был ли он?), промежуточный байт-код принимаю за ассемблер процессовра.

sv75 ★★★★★
()
Ответ на: комментарий от cvs-255

>UNIX с самого начала писался на сях.

какая новость! и что с того?

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

>Эх, лихие 70-е

"Это были 70-е, мы программировали как могли" :)

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

> из-за судебных разбирательств код AT&T убрали и 4.4BSD Unix переименовали в 4.4BSD

Какая вопиющая неграмотность, говоря местными правилами — 4.2. Рекомендую проверять свои предположения, например поискать с исходниках строчку

(c) UNIX System Laboratories, Inc.

В BSD хватает кода UNIX, как и во всех UNIX полно кода BSD. Даже самый известный «не юникс» GNU/Linux без кода из Беркли оказывается практически нежизнеспособным.

А с новостью вообще весело: на самом деле это не баг в самом yacc, а ошибка при /портировании/ его на sparc64.

baka-kun ★★★★★
()

Прочитал как "Найден 33-летний баг в коде УЖАСС" =)

clr
()
Ответ на: комментарий от baka-kun

>В BSD хватает кода UNIX, как и во всех UNIX полно кода BSD. Даже самый известный «не юникс» GNU/Linux без кода из Беркли оказывается практически нежизнеспособным.

Ты не путай копирайт в коде который переписали с нуля и тот код что принадлежал AT&T.

>В BSD хватает кода UNIX, как и во всех UNIX полно кода BSD. Даже самый известный «не юникс» GNU/Linux без кода из Беркли оказывается практически нежизнеспособным.

Собственно и что дальше? Опенсорс это, лицензия BSD позволяет делать с кодом все что хочется.

Metallic
()
Ответ на: комментарий от Lumi

> Альтернативный хронограф? Пиши ещё!
Cамое страшное в этом то, что он говорит серьёзно %))

UVV ★★★★★
()

"ага, вот эти баги.. ненене, Отто Моэрбик, ненене!"

megabrain
()
Ответ на: комментарий от phasma

>из-за судебных разбирательств код AT&T убрали и 4.4BSD Unix >переименовали в 4.4BSD

Путаешь 4.4BSD и 4.4BSD-lite

Alphaer ★★
()
Ответ на: комментарий от cvs-255

вообще-то до 3-го релиза на асемблере 3-й релиз уже был полностью переписан на сях

bsw_m
()
Ответ на: комментарий от baka-kun

> А с новостью вообще весело: на самом деле это не баг в самом yacc, а ошибка при /портировании/ его на sparc64.

ты что, Ь?

с чего тогда такие выводы?

зайди, почитай новость хоть, в архивах misc@ или на undeadly.org

ошибка в *yacc*. просто впервые ее заметили при использовании модифицированного Отто маллока(), на спарках64. ошибка может проявиться на любой архитектуре. на любой ОСи, в любой ее программе, использующей yacc. при портировании никаких ошибок добавлено небыло. она там сидела всегда. кстати же, она 100% есть в OpenSolaris и DragonFlyBSD. насчет остальных не знаю, но советую им тоже поспешить проверить, т.к. сомневаюсь, что линуксоиды переписывали yacc с нуля.

еще раз, для крикунов безграмотных, которые не удосуживают себя прочтением новости. ошибку вызывает вот эта строчка в yyparse() из yacc(1).

yyval = yyvsp[1-yym];

она вызывает обращение к stack entry на единицу большем, чем положено. конечно же, в результате имеем SEGV.

a malloc() Отто тут при том, что обычно это не проблема, так как вы просто используете мусор из ОП, но его маллок перемещает выделенные фрагменты памяти к концу страницы, так что банальная ошибка на единицу ведет к SIGSEGV. это и планировалось для выявления вот таких вот скрытых багов. еще один механизм OpenBSD для борьбы с некачественным кодом.

Отто Моэрбик большой молодец! как говорят на андедли, "с ним не поспоришь, он сортирует списки О(1)"

Тоесть, еще раз, эта ошибка *может* присутствовать в любом yacc. На любой оси. Правда, без маллока Отто она бы проявилась, только если делать

A: /* empty */ { foo(); };

что, согласитесь, редкость =)

val-amart ★★★★★
()
Ответ на: комментарий от anonymous

>Да речь не о контенте, а о том, что со временем все компы могут стать тостерами с невозможностью изменения пользователем.

Потому и нужно свободное железо.

По теме: Мне кажется прогу на C дописать невозможно, раз через 33 года ещё не все баги отловили :D

KUser
()

кстати у меня в свое время гцц довольно часто с внутренней ошибкой падал, и без всяких бзд.

pronvit
()

Ну и замечательно, что исправили :)

BSD-фобы, ну вы поняли, куда вам надо идти, да? :)

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

> Ты не путай копирайт в коде который переписали с нуля и тот код что принадлежал AT&T.

Ты не задумывался, какого черта будет делать чужой копирайт в написанном с нуля коде? Это самый что ни на есть оригинальный код UNIX.

> Опенсорс это, лицензия BSD позволяет делать с кодом все что хочется.

BSDL позволяет далеко не всё, чего может захотеться. В частности, запрещает менять лицензию на BSD код.

Вообще, зачем пороть чушь? Ей же больно. Подробности судебного дела и договоренности давно обнародованы, когда USL наехала на BSD, те выкатили встречный иск о нарушении BSDL. Если бы не удалось договориться, из UNIX пришлось бы выбросить половину юзерленда, сокеты и TCP/IP. В результате сошлись на том, что USL будет соблюдать лицензию BSD, а Беркли получает право использовать часть кода UNIX на условиях BSDL.

baka-kun ★★★★★
()
Ответ на: комментарий от anonymous

>типо дайошь типизированный, управляемый ассемблер?

Ассемблер куда лучше управляется, чем Си.

Nxx ★★★★★
()
Ответ на: комментарий от baka-kun

> В частности, запрещает менять лицензию на BSD код.

С какой радости? Если условия новой лицензии не противоречат условиям BSDL - то пожалуйста, можно менять.

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

> Марш в школу учить историю.

Это как раз к тебе относится :)

Правило "-1" действует для веков, так как их нумеруют с единицы, а даты у нас с нуля.

Для десятилетий - нет. Что в русском, что в английском, будет good old 60s (шестидесятые) или там застойные 70е.

DarkFlame ★★
()
Ответ на: комментарий от val-amart

> Отто Моэрбик большой молодец! как говорят на андедли, "с ним не поспоришь, он сортирует списки О(1)"

Маладец, харашо сказал, всему верю но вот про O(1), простите, нет. Ирония? Над ним издевались наверное? ;-)

alx_me ★★☆
()
Ответ на: комментарий от val-amart

> ошибка в *yacc*. просто впервые ее заметили ... на спарках64.

Я немного некорректно выразился. Естественно, ошибка в yacc. Просто после плодотворного обсуждения пришли к выводу, что такой код получился после двух допущений.

Первое, общего рода, заключается в том, что правило без правой части, как ты мягко и корректно выразился, — «редкость». Редкостная, надо сказать, редкость. Но если уж она встретилась, то нам абсолютно наплевать, какое значение окажется результатом.

Второе, зависимое от платформы, — за стеком всегда достаточно какого-нибудь «мусора», поэтому можно избавиться от ветвления, и тем более не расходовать память. Да, этот off by one «несекурен», но в рамках платформы проблем с безопасностью не создаёт.

А вот при /портировании/ на другую платформу второе допущение перестало работать. Возникла необходимость править код.

Кстати, почему решение от Отто использует дорогое ветвление в цикле, вместо намного более дешевой памяти? Ведь достаточно поправить выделение памяти для стека на

realloc(yyvs, (newsize + 1) * sizeof *newvs).

baka-kun ★★★★★
()
Ответ на: комментарий от GFORGX

> С какой радости? Если условия новой лицензии не противоречат условиям BSDL - то пожалуйста, можно менять.

Нельзя. BSDL не даёт права изменить лицензию на код, а в авторском праве по умолчанию «всё запрещено, что не разрешено». BSDL разрешает только распространять и использовать в любом виде, в том числе с модификациями, но при этом прямо требует сохранять лицензию с каждой копией (хоть в сорцах, хоть в бинарниках).

Это только твоё собственное творение, который взаимодействует с BSDL частью, может быть под какой угодно лицензией, но изменить условия распространения BSDL кода ты не имеешь права.

baka-kun ★★★★★
()
Ответ на: комментарий от KUser

> Означает ли это, что winsock.dll не подпадает под MS EULA ?

/Если/ winsock.dll содержит в себе часть под BSDL, то /этот конкретный/ кусок распространяется в соответствие с BSDL, и значит где-то в сопроводительной документации /обязательно/ присутствует текст BSD лицензии.

baka-kun ★★★★★
()
Ответ на: комментарий от alx_me

>Маладец, харашо сказал, всему верю но вот про O(1), простите, нет. Ирония? Над ним издевались наверное? ;-)

Есть алгоритм сортировки списков с O(N)

odip ★★
()
Ответ на: комментарий от baka-kun

>Кстати, почему решение от Отто использует дорогое ветвление в цикле, вместо намного более дешевой памяти? Ведь достаточно поправить выделение памяти для стека на
>realloc(yyvs, (newsize + 1) * sizeof *newvs).

Мне тоже не понравился его фикс
Но есть еще такой момент - при yym == 0 надо вернуть не мусор, а например 0.
а это значит что по адресу yyvsp[1] должен лежать всегда этот 0, чтобы он вернулся.

odip ★★
()
Ответ на: комментарий от baka-kun

>Нельзя. BSDL не даёт права изменить лицензию на код, а в авторском праве по умолчанию «всё запрещено, что не разрешено». BSDL разрешает только распространять и использовать в любом виде, в том числе с модификациями, но при этом прямо требует сохранять лицензию с каждой копией (хоть в сорцах, хоть в бинарниках).

>Это только твоё собственное творение, который взаимодействует с BSDL частью, может быть под какой угодно лицензией, но изменить условия распространения BSDL кода ты не имеешь права.

Ты текст BSDL своей выложи магической и ссылку дай, а то их несколько штук есть ;-)

Metallic
()
Ответ на: комментарий от odip

> Но есть еще такой момент - при yym == 0 надо вернуть не мусор, а например 0.

Не нужно, результат не определен. Ты ведь не используешь в своих проектах значение, возвращаемое функциями типа 'void func()'?

Если тебе нужен результат «пустой» правой части, то

A: { $$ = NULL; };

Вообще-то и не должно приходить в голову описывать корректную грамматику с пустыми определениями (присвоением неопределенного значения).

baka-kun ★★★★★
()
Ответ на: комментарий от GFORGX

> Что тогда с Atheros?

А что с ним сейчас не так? Заимствованный из ar5k код распространяется под BSDL, проекту дали право добавить альтернативное распространение по условиям GPLv2. Но BSDL никто не вычеркивает.

baka-kun ★★★★★
()
Ответ на: комментарий от Metallic

> Ты текст BSDL своей выложи магической

Почему «магической»? Самая простая, в минимальном виде
(disclaimer я сократил):

Copyright (C) [year] [holder]. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY AUTHOR AND ... bla-bla-bla ...


Покажи мне где, где здесь передаётся право на смену лицензии.

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

>Покажи мне где, где здесь передаётся право на смену лицензии.

Неправильно мыслишь, здесь вообще не сказано про то, что _нельзя это перелицензировать_ ;-)

Metallic
()
Ответ на: комментарий от baka-kun

Вероятнее всего содержит, т.к. в файле есть строки "BSD Socket API for Windows".
Если это так, могу ли я его распространять?
Ведь BSDL это разрешает, а это код BSD с модификациями?

KUser
()
Ответ на: комментарий от Ttt

> yacc

> прочитал "ужасс" =)

Пионеры на лоре!

sv75 ★★★★★
()
Ответ на: комментарий от baka-kun

> А с новостью вообще весело: на самом деле это не баг в самом yacc, а ошибка при /портировании/ его на sparc64.

Ага, С опять оказался не кросс-плфтформенным ассемблером?

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