Я люблю вас, программисты!
Jun. 29th, 2007 09:38 pmПока писал заголовок, понял, ни знаки препинания, ни смайлики, не покрывают множества базовых эмоций человека. Очень симптоматично. Но сейчас не об этом.
Допив вторую бутылку пива до половины, я таки нашел ошибку, и поскольку я слишком пьян чтобы писать багрепорты и патчи (кнопка backspace у меня сейчас самая любимая), я побрюзжу на тему наболевшего...
В коммунивер типа можно загружать картинки. В том числе и флешевые мультики, которые не картинки, но не принципиально. В процесс загрузки для определения того что это валидная картинка, для определения ее типа и размера используется модуль Image::Size. В README.flash честно написано, что для случая flash6 Image::Size v.2.992 в случе если размер файла больше килобайта, _в_некоторых_случаях_ работает неверно. И что нужно наложить патч. Патч приложен. (Патч весьма поган, потому что в нем зачем-то поменяли название всех внутренних констант, через что поменялись все строки и для того чтобы вычленить структурно важные изменения, пришлось приложить некие усилия).
На с тех пор вышла версия 3.01, функция разборки flash6 файла там поменялась, и судя по всему идеи из коммуниверного патча туда попали.
-- Так, -- сказали суровые Московские программисты и натравили Image::Size на коллекцию Масяни...
Выяснилось, что большинство Масяни записано в flash5, и лишь фрагментами в flash6. Кроме того выяснилось что на очередном flash6 файле оно валиться нафиг... При этом если попытаться переписать этот файл в отдельную директорию, то все работает нормально.... Почему -- непонятно.
-- Так... -- сказали суровые Московские программисты, вытащили из Cpan'а Image::Size v.2.992, и натравили его на коллекцию Масяни...
Выяснилось... Image::Size v.2.992 падает на первом же файле flash6. При этом не на том, на котором падал 3.01
-- Так!!! -- сказали суровые Московские фрилансеры, и наложили патч на Image::Size v.2.992.
Выяснилось, что патч -- вещь фирменная, и коллекция Масяни им обрабатывается наура...
Дальше осталось сделать две вещи: во-первых понять при каких условиях падает 3.01, потому как не могу я для демонстрации ошибки прислать разработчику 250 мегабайт Масяни, а во-вторых выяснить что же именно такое есть в патче для 2.992, чего нету в 3.01.
Сначала я попытался загрузить некий flash6 файл много подряд раз (цикл до 10000 написал). Все 10000 раз (или меньше, мне надоело ждать) он его обработал нормально... Меня это озадачило... Продолжил беспорядочные эксперименты. В конце концов выяснил, что если обработать два файла с разными именами подряд (содержимое может быть одинаковым) , то оно падает.
Уже легче. Всю Масяню слать не надо. Тем более, что в дистрибутиве идет подходящий flash6 файл. А то одна Масяня -- все равно много.
Далее начинаем последовательно дебагить функцию swfmxsize, параллельно сравнимая ее имеющимся заведомо рабочим патчем, дабы таки выяснить в какой момент она начинает себя вести неправильно... Там всего 11 строк, так что метод перебора уж точно сработает...
Долго ли, коротко ли, но в конце концов выяснилось, что если заменить
$header = $d->inflate(substr($header, 8, 1024));
на
$header = substr($header, 8, 1024);
my ($output,$status) = $d->inflate($header);
то все заработает.
ЁБ ВАШУ МАТЬ!!!! Я не вижу принципиальной разницы между предложенными кусками кода... Тем более не понимаю, почему оно не работает только при втором вызове...
Но вот факт... Оно помогает. Почему, хуй его знает...
Вот такая, блядь вечная молодость...
Допив вторую бутылку пива до половины, я таки нашел ошибку, и поскольку я слишком пьян чтобы писать багрепорты и патчи (кнопка backspace у меня сейчас самая любимая), я побрюзжу на тему наболевшего...
В коммунивер типа можно загружать картинки. В том числе и флешевые мультики, которые не картинки, но не принципиально. В процесс загрузки для определения того что это валидная картинка, для определения ее типа и размера используется модуль Image::Size. В README.flash честно написано, что для случая flash6 Image::Size v.2.992 в случе если размер файла больше килобайта, _в_некоторых_случаях_ работает неверно. И что нужно наложить патч. Патч приложен. (Патч весьма поган, потому что в нем зачем-то поменяли название всех внутренних констант, через что поменялись все строки и для того чтобы вычленить структурно важные изменения, пришлось приложить некие усилия).
На с тех пор вышла версия 3.01, функция разборки flash6 файла там поменялась, и судя по всему идеи из коммуниверного патча туда попали.
-- Так, -- сказали суровые Московские программисты и натравили Image::Size на коллекцию Масяни...
Выяснилось, что большинство Масяни записано в flash5, и лишь фрагментами в flash6. Кроме того выяснилось что на очередном flash6 файле оно валиться нафиг... При этом если попытаться переписать этот файл в отдельную директорию, то все работает нормально.... Почему -- непонятно.
-- Так... -- сказали суровые Московские программисты, вытащили из Cpan'а Image::Size v.2.992, и натравили его на коллекцию Масяни...
Выяснилось... Image::Size v.2.992 падает на первом же файле flash6. При этом не на том, на котором падал 3.01
-- Так!!! -- сказали суровые Московские фрилансеры, и наложили патч на Image::Size v.2.992.
Выяснилось, что патч -- вещь фирменная, и коллекция Масяни им обрабатывается наура...
Дальше осталось сделать две вещи: во-первых понять при каких условиях падает 3.01, потому как не могу я для демонстрации ошибки прислать разработчику 250 мегабайт Масяни, а во-вторых выяснить что же именно такое есть в патче для 2.992, чего нету в 3.01.
Сначала я попытался загрузить некий flash6 файл много подряд раз (цикл до 10000 написал). Все 10000 раз (или меньше, мне надоело ждать) он его обработал нормально... Меня это озадачило... Продолжил беспорядочные эксперименты. В конце концов выяснил, что если обработать два файла с разными именами подряд (содержимое может быть одинаковым) , то оно падает.
Уже легче. Всю Масяню слать не надо. Тем более, что в дистрибутиве идет подходящий flash6 файл. А то одна Масяня -- все равно много.
Далее начинаем последовательно дебагить функцию swfmxsize, параллельно сравнимая ее имеющимся заведомо рабочим патчем, дабы таки выяснить в какой момент она начинает себя вести неправильно... Там всего 11 строк, так что метод перебора уж точно сработает...
Долго ли, коротко ли, но в конце концов выяснилось, что если заменить
$header = $d->inflate(substr($header, 8, 1024));
на
$header = substr($header, 8, 1024);
my ($output,$status) = $d->inflate($header);
то все заработает.
ЁБ ВАШУ МАТЬ!!!! Я не вижу принципиальной разницы между предложенными кусками кода... Тем более не понимаю, почему оно не работает только при втором вызове...
Но вот факт... Оно помогает. Почему, хуй его знает...
Вот такая, блядь вечная молодость...