nataraj: (Default)
[personal profile] nataraj
Пока писал заголовок, понял, ни знаки препинания, ни смайлики, не покрывают множества базовых эмоций человека. Очень симптоматично. Но сейчас не об этом.

Допив вторую бутылку пива до половины, я таки нашел ошибку, и поскольку я слишком пьян чтобы писать багрепорты и патчи (кнопка 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);

то все заработает.

ЁБ ВАШУ МАТЬ!!!! Я не вижу принципиальной разницы между предложенными кусками кода... Тем более не понимаю, почему оно не работает только при втором вызове...

Но вот факт... Оно помогает. Почему, хуй его знает...
Вот такая, блядь вечная молодость...

Date: 2007-06-29 07:00 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Ну, лезь теперь грязными лапами в Compress::Zlib или кто там у тебя inflate делает, и разбирайся п чем разница. В перле иногда с переменным очнеь загадочные вещи бывают. Помнится как-то мы с Раном чуть ли не месяц не могли понять, почему значекие не untaint-ится. Оказалось, что это бага в ядре перла и статус tainted залипает у имени, а не у значения. В общем, судьба тебе Верблюда наизусть учить, а то и Пантеру.

Date: 2007-06-29 07:21 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Ну как же, как же... Даже, практически не зная Перла, своим невинным взглядом вижу существенную разницу между этими двумя фрагментами.
1) В первом случае результат присваивается скалярной переменной, во втором -- кортежу. Зная, что контекст вычисления у перла зависит не только от аргументов, но и от требуемого типа результата, я бы ничему не удивлялся. Ну и $header во втором случае остаётся не расжатым.
2) Я не уверен, насколько хорошо подсовывать inflate произвольно обрезанный кусок.
3) Из поганого опыта на других языках. В этих случаях совершенно разное распределение памяти. Я не совсем понял, как оно "валиться нафиг", но если это корка на inflate, то причина, к сожалению, знакома -- грязно написанный код бинарной библиотеки.

Попробуйте substr без третьего аргумента. Если заработало -- значит (2) или (3).

Date: 2007-06-29 07:23 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Ну, лезь теперь грязными лапами в Compress::Zlib или кто там у тебя inflate делает, и разбирайся в чем разница.
А я в Compress::Zlib и не лезу. Это кусок Image::Size

а то и Пантеру.
Э... пантеры я кажется не видел...

И вообще... Я не совсем понимаю, зачем разбираться почему именно оно работает, если гиганты, на плечах у которых я стою, уже написали патч, а я его смог успешно перенести на новую версию Image::Size... ;-) Оно ж теперь работает ;-)

Date: 2007-06-29 07:53 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Гм... залез...
Правда не совсем глубоко, а просто поставил новую версию Compress::Zlib... (2.004 вместо идущий с дебианом 1.42)
Помогло... С новой версией Compress::Zlib непатченная Image::Size v.3.01 работает :-/

Date: 2007-06-29 08:01 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
А помогает ли замена substr($header, 8, 1024) на substr($header, 8)?

Date: 2007-06-29 08:18 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Ну ты понял...

Date: 2007-06-30 04:19 am (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Поднять версию Image::Size до 3.01 а Compress::Zlib до 2.001, а так же написать текст проверяющий обнаруженную фичебагу...
?

Date: 2007-06-30 04:20 am (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
то есть не текст, а тест...

Да.

Date: 2007-06-30 06:13 am (UTC)
From: [identity profile] beldmit.livejournal.com
А не получится поднять только версию Compress::Zlib?

Re: Да.

Date: 2007-06-30 07:04 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Проверил, не получится...

Если вдруг патч который я пошлю разработчику Image::Size в течении июля применят, то получится поднять версию только для Image::Size

Re: Да.

Date: 2007-07-01 07:20 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Это, мне кажется, лишено смысла. Поднимай для обоих.

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 21st, 2026 11:07 am
Powered by Dreamwidth Studios