Lipetsk *nix Association Forum Lipetsk *nix Association Forum
Новости:
 
*
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
28 Ноября 2024, 02:56:29


Войти


Страниц: [1]   Вниз
  Печать  
Автор Тема: Баг 25 летней давности  (Прочитано 13791 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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().
Записан

Кривыми должны быть извилины, а не руки!
qwertolet
Новичек
*

Карма: 0
Сообщений: 4


Награды
« Ответ #1 : 16 Сентября 2008, 10:49:10 »

Надо же  Шокирован
Записан
Akela
Продвинутый
***

Карма: -4
Сообщений: 219


CalculateLinux 10.0


Награды
« Ответ #2 : 16 Сентября 2008, 11:19:05 »

а представляете, что обнаружат лет этак через пятьдесят? Смеющийся
Записан

я здесь не потому, что люблю Linux, а потому что ненавижу Windows...
Леголегс
Гуру
******

Карма: 18
Сообщений: 1006


Fedora 12 x86_64


Награды
« Ответ #3 : 16 Сентября 2008, 13:42:47 »

Не знаю что через 50, а через 30 будет беда. Роботы свихнутся, почтовики на фре начнут рассылать спам, в Ташире научатся делать пиццу, коллайдер налетит на небесную ось, в общем хана. А всё из-за одной маленькой, но гордой 4хбайтной переменной time_t.
Записан

[ Мой FTP ftp://legolegs.homelinux.net ]
[ Репозиторий Fedora http://fedora.leschat.net/ ]
[ Репозиторий Ubuntu http://ubuntu.leschat.net/ ]
PPA
Юзверь
**

Карма: 4
Сообщений: 80


WWW Награды
« Ответ #4 : 16 Сентября 2008, 17:20:07 »

"в Ташире научатся делать пиццу" Улыбка
Записан

--
~PPA() {} //
PPA
Юзверь
**

Карма: 4
Сообщений: 80


WWW Награды
« Ответ #5 : 16 Сентября 2008, 17:21:38 »

А всё из-за одной маленькой, но гордой 4хбайтной переменной time_t.

#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;      /* time value */
#else
typedef __time64_t time_t;      /* time value */
#endif
Записан

--
~PPA() {} //
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines

Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM