komp
Продвинутый
Карма: 0
Сообщений: 127
Win7 & Ubuntu KDE
|
|
« : 11 Мая 2008, 23:19:10 » |
|
1983. Год, когда появились IBM PC XT, Apple Lisa и Pioneer 10 покинул солнечную систему. Тогда же родился 25 летний баг в BSD, залатанный совсем недавно.
Несколько дней назад Марк Балмер, разработчик OpenBSD, получил письмо от пользователя этой системы в котором утверждалось, что SAMBA вылетала при получении файлов из файловой системы MS-DOS. Балмер связался с разработчиками SAMBA и узнал, что тем приходится использовать обходные пути, чтобы она корректно работала на BSD системах: код для чтения папок ошибочен во всех них.
Понятно, что Балмер сначала не поверил в это. «Конечно же, сначала я возложил всю вину на SAMBA,» пишет Марк. Но все же решив разобраться с этим случаем, он обнаружил баг, который находился во всех BSD-системах (включая Mac OS X) с очень давнего времени: он нашел его даже в 4.2BSD, выпущенной в Августе 1983 года!
Баг обнаруживается при чтении второй записи в блоке, где первая была удалена: seekdir() вызывает readdir(), пропускающую первую запись (inode у нее установлен на ноль), и переходит ко второй записи. Когда пользователь вызывает readdir(), чтобы прочитать папку, которую он только что определил через seekdir(), он получит не вторую запись, а третью.
Маршалл Керк МакКусик, разработчик *dir(), так прокомментировал эту проблему в беседе с Балмером:
Как автор библиотеки *dir(), я могу сказать, что вы, скорее всего, исправили одну из моих ошибок :-) До появления *dir(), непосредственно программы открывали, читали и интерпретировали папки. Тогда мне пришлось обновить целых 22 приложения (большая часть всех программ, доступных для UNIX в то время), чтобы заменить прямую интерпретацию папок на вызовы *dir().
Исправление не заняло много времени: _readdir_unlocked() не должна пропускать записи с inode, установленным на ноль, при вызове из __seekdir().
|