Bug 27505

Summary: Начал крашиться на многих avi файлах
Product: Branch t6 Reporter: Roman Savochenko <rom_as>
Component: libxineAssignee: Sergey V Turchin <zerg>
Status: CLOSED FIXED QA Contact: QA t6 <qa-t6>
Severity: critical    
Priority: P3 CC: anubix
Version: не указана   
Hardware: all   
OS: Linux   
URL: https://bugs.xine-project.org/show_bug.cgi?id=491
Attachments:
Description Flags
Падение при проигрывании Тачки.2.2011
none
Падение при проигрывании Kak.priruchit.drakona.2010
none
Обход проблемы доступа за границу выделенной памяти none

Description Roman Savochenko 2012-06-26 22:43:44 MSK
Начиная с версии libxine-1.1.21 появились краши при проигрывании многих avi.
Замечено было на kaffeine, однако таким-же образом падения замечены и на xine-ui, на тех-же файлах.
Comment 1 Sergey V Turchin 2012-06-27 14:44:44 MSK
Для начала было бы неплохо ссылку на пример или журнал отладки падения.
Comment 2 Roman Savochenko 2012-06-27 15:49:33 MSK
(В ответ на комментарий №1)
> Для начала было бы неплохо ссылку на пример или журнал отладки падения.
Вчера как раз готовил отчёт glibc о проблемах с памятью при вызове xine, когда предыдущая проблема с kernel-3.0.35 + nvidia_glx_295.59 (27506), после вызова ufoai, привела даже к падению иксов (неполному, скорее дрова NVidia заклинило).

Сегодня половлю и выделю файл с наиболее ярким проявлением этой проблемы. Заодно проверю на Сизифе.
Comment 3 Sergey V Turchin 2012-06-27 19:46:19 MSK
Я отправли на сборку новый libxine. Как-минимум у меня 1 непоказывавшийся avi стал показываться.
Comment 4 Roman Savochenko 2012-06-27 21:00:04 MSK
Created attachment 5499 [details]
Падение при проигрывании Тачки.2.2011

Файлы выкладывать не буду иначе с моего сервера прийдётся его грузить долго.
Comment 5 Roman Savochenko 2012-06-27 21:01:57 MSK
Created attachment 5500 [details]
Падение при проигрывании Kak.priruchit.drakona.2010
Comment 6 Roman Savochenko 2012-06-27 21:04:55 MSK
Падения похожи хотя из kaffeine падение может ещё происходить в момент закрытия потока xine, причём и в TDE и в KDE4.

В Сизифе падения замечаются тоже, хотя достаточно редко.
Comment 7 Zerg 2012-06-28 11:57:51 MSK
(В ответ на комментарий №4)
> Файлы выкладывать не буду иначе с моего сервера прийдётся его грузить долго.
На торренты ссылку можно.

Из-под нового пользователя попробуйте на всякий.
Comment 8 Sergey V Turchin 2012-06-28 15:47:00 MSK
(В ответ на комментарий №6)
> из kaffeine падение может ещё происходить в момент закрытия
C libxine > 1.1.21-alt2 ?
Comment 9 Roman Savochenko 2012-06-28 19:52:52 MSK
(В ответ на комментарий №8)
> (В ответ на комментарий №6)
> > из kaffeine падение может ещё происходить в момент закрытия
> C libxine > 1.1.21-alt2 ?
А он где? В T6 его нет.
Comment 10 Roman Savochenko 2012-06-29 12:13:40 MSK
(В ответ на комментарий №8)
> (В ответ на комментарий №6)
> > из kaffeine падение может ещё происходить в момент закрытия
> C libxine > 1.1.21-alt2 ?
Собрал 1.1.21-alt3 из Сизифа. Проблема осталась и воспроизводится у меня на двух машинах с T6. Ещё немного отчётов с падениями:

************************************************************************
************ The.Legend.of.Korra.S01E07.www.alive-ua.com.avi ***********
[roman@roman ~]$ xine
This is xine (X11 gui) - a free video player v0.99.5.
(c) 2000-2007 The xine Team.
socket(): Address family not supported by protocol
No accelerated IMDCT transform found
[mpeg4 @ 0x8818ec0] header damaged
*** glibc has detected an error in xine: free(): invalid pointer: 0x0895eea0 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6b9da)[0xb73e79da]
/lib/libc.so.6(+0x6d313)[0xb73e9313]
/lib/libc.so.6(cfree+0x71)[0xb73ec591]
/usr/lib/libavutil.so.51(av_free+0x1b)[0xb58c715b]

************************************************************************
************ Тачки.2.2011.avi ******************************************
[roman@roman ~]$ xine
This is xine (X11 gui) - a free video player v0.99.5.
(c) 2000-2007 The xine Team.
socket(): Address family not supported by protocol
No accelerated IMDCT transform found
*** glibc has detected an error in xine: corrupted double-linked list: 0x081f1578 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6b9da)[0xb74169da]
/lib/libc.so.6(+0x6e99e)[0xb741999e]
/lib/libc.so.6(__libc_malloc+0x60)[0xb741b0c0]
/lib/libc.so.6(+0x1fff8)[0xb73caff8]
/lib/libc.so.6(+0x19025)[0xb73c4025]
/lib/libc.so.6(+0x17a24)[0xb73c2a24]
/lib/libc.so.6(iconv_open+0xcc)[0xb73c25dc]
/usr/lib/libxine.so.1(+0x2aca9)[0xb7749ca9]

************************************************************************
************ Kak.priruchit.drakona.2010.avi ****************************
[roman@roman ~]$ xine
This is xine (X11 gui) - a free video player v0.99.5.
(c) 2000-2007 The xine Team.
socket(): Address family not supported by protocol
No accelerated IMDCT transform found
*** glibc has detected an error in xine: free(): invalid pointer: 0xb0172938 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6b9da)[0xb738f9da]
/lib/libc.so.6(+0x6d313)[0xb7391313]
/lib/libc.so.6(cfree+0x71)[0xb7394591]
/usr/lib/libfreetype.so.6(+0x6c7d)[0xb7236c7d]
/usr/lib/libfreetype.so.6(+0xbd6a)[0xb723bd6a]
/usr/lib/libfreetype.so.6(FT_Remove_Module+0x10f)[0xb723f26f]
/usr/lib/libfreetype.so.6(FT_Done_Library+0x140)[0xb723f9a0]
/usr/lib/libfreetype.so.6(FT_Done_FreeType+0x28)[0xb72370a8]
/usr/lib/libxine.so.1(+0x2c752)[0xb76c4752]

В целом замечается два типа падения: почти сразу после запуска и при выходе. Повторяемость процентов 50. Падение при запуске лучше всего воспроизводится если открывать файл из меню xine, а не передавать в командной строке.

Из файлов на которых хорошо воспроизводятся падения есть The.Legend.of.Korra.S01E07.www.alive-ua.com.avi, который имеет размер 300Мб, загрузить его можно здесь: http://alive-ua.com/cartoons/70867-avatar-legenda-o-korre-1-sezon-the-last-airbender-the-legend-of-korra-2012ruseng-hdtvrip.html
Comment 11 Zerg 2012-06-29 14:15:29 MSK
(В ответ на комментарий №9)
> > C libxine > 1.1.21-alt2 ?
> А он где? В T6 его нет.
Не доехал еще, значит. Из P6 можно пока взять.
Comment 12 Zerg 2012-06-29 14:17:32 MSK
(В ответ на комментарий №10)
> > > из kaffeine падение может ещё происходить в момент закрытия
> > C libxine > 1.1.21-alt2 ?
> Собрал 1.1.21-alt3 из Сизифа. Проблема осталась и воспроизводится у меня на
> двух машинах с T6. Ещё немного отчётов с падениями:
Это ж не kaffeine.

P.S.
С xine воспроизвел. Новый xine-ui не лечит.
Comment 13 Roman Savochenko 2012-06-29 16:34:01 MSK
(В ответ на комментарий №12)
> > Собрал 1.1.21-alt3 из Сизифа. Проблема осталась и воспроизводится у меня на
> > двух машинах с T6. Ещё немного отчётов с падениями:
> Это ж не kaffeine.
> С xine воспроизвел. Новый xine-ui не лечит.
Не kaffeine, но в нём фактически то-же самое и воспроизводил на xine что-бы оторвать связь с kaffeine, а выделить первоисточник.
Comment 14 Roman Savochenko 2012-07-07 08:42:27 MSK
Ещё один момент.
Повторяемость падений не 100% т.е раза с третьего-четвёртого проигрывание запускается и играет до конца, хотя затем может упасть при выходе.
Comment 15 Roman Savochenko 2012-11-10 15:30:39 MSK
Проблема по прежнему актуальна и сейчас 100% воспроизводится на одном из avi.
Очередной подход к изучению проблемы показал:
- пересборка пакетов libav-0.8.4-alt1, libxine-1.1.21-alt3, xine-ui-0.99.6-alt1.1 и kaffeine-0.8.8-alt8 проблемы не решает;
- замечена связь проблемы с архитектурой, а именно проблема воспроизводится на x86_32, при этом на x86_64 в том-же окружении проблемы нет;
- от дистрибутива T6 или Sisyphus проблема похоже не зависит, На Sisyphus-x86 падения правда не проверял;
- проблема устойчиво связана с операциями на памяти, а именно двойное выделение-освобождение в библиотеке libav, функций av_malloc() и av_free().

Возник из всего этого вопрос. Какая в libav может быть зависимость от архитектуры, которая приводит к подобным проблемам на x86_32?
Comment 16 Zerg 2012-11-10 15:51:27 MSK
(В ответ на комментарий №15)
> Какая в libav может быть зависимость от архитектуры
Теоретически что угодно.
У меня p6 из подручных только x86_64.
Для начала попробуйте libav из ftp://devel.altlinux.ru/zerg/misc/M60P/p6_zerg/
Если воспроизведется, я еще обновлю там до http://packages.altlinux.org/en/Sisyphus/srpms/libav
Comment 17 Roman Savochenko 2012-11-10 18:16:51 MSK
(В ответ на комментарий №16)
> У меня p6 из подручных только x86_64.
> Для начала попробуйте libav из ftp://devel.altlinux.ru/zerg/misc/M60P/p6_zerg/
Этот без изменений.

> Если воспроизведется, я еще обновлю там до
> http://packages.altlinux.org/en/Sisyphus/srpms/libav
До этого я и сам обновлял, см. комментарий №15

Попробовал --disable-memalign-hack и теперь не падает, хоть при запуске, полностью играется, а затем падает при выходе.

Попробую жестко выбрать тип memalign или отключить его вообще.
Comment 18 Zerg 2012-11-12 22:33:54 MSK
(В ответ на комментарий №17)
> Попробовал --disable-memalign-hack и теперь не падает, хоть при запуске,
А в libav-0.8.4 он отключен по умолчанию. Погоняю его и в p6, наверное, отправлю.
Comment 19 Roman Savochenko 2012-11-12 23:15:13 MSK
(В ответ на комментарий №18)
> (В ответ на комментарий №17)
> > Попробовал --disable-memalign-hack и теперь не падает, хоть при запуске,
> А в libav-0.8.4 он отключен по умолчанию. Погоняю его и в p6, наверное,
> отправлю.
Моя ошибка, как раз я включил этот параметр --enable-memalign-hack. Остальное по простому там не проверишь.
Comment 20 Roman Savochenko 2013-01-03 23:12:46 MSK
Valgrind по этому поводу сообщает такое:

==11648== Thread 6:
==11648== Invalid read of size 4
==11648==    at 0xAA299A1: pp_postprocess (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x72dc2c5 is 965 bytes inside a block of size 967 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==
==11648== Invalid read of size 4
==11648==    at 0xAA29990: pp_postprocess (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x72dc2c9 is 2 bytes after a block of size 967 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==
==11648== Invalid write of size 4
==11648==    at 0xAA29999: pp_postprocess (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x7b5143c is 892 bytes inside a block of size 893 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==
==11648== Invalid read of size 1
==11648==    at 0xAA0F768: ??? (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x72dc2c7 is 0 bytes after a block of size 967 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==
==11648== Invalid read of size 1
==11648==    at 0xAA0F75C: ??? (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x7b5143d is 0 bytes after a block of size 893 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==
==11648== Invalid read of size 1
==11648==    at 0xAA0ECEE: ??? (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x72dc2c7 is 0 bytes after a block of size 967 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==
==11648== Invalid read of size 1
==11648==    at 0xAA0ECEA: ??? (in /usr/lib/libpostproc.so.52.0.0)
==11648==  Address 0x7b5143d is 0 bytes after a block of size 893 alloc'd
==11648==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==11648==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==11648==    by 0x80290EC: av_malloc (in /usr/lib/libavutil.so.51.22.1)
==11648==

Что при определённых обстоятельствах и разбивке памяти вполне может вызывать проблемы.
Я вот только не пойму. Это pp_postprocess() лезет за границу выделенной памяти или memalign() некорректно выделяет.
Кстати это объясняет почему --enable-memalign-hack несколько смягчает проблему, покольку образ выделения памяти меняется и вылезание за её границы не сразу вызывает падение.
Comment 21 Roman Savochenko 2013-01-06 00:06:07 MSK
(В ответ на комментарий №20)
> Valgrind по этому поводу сообщает такое:
Детализировал, установив пакеты с отладочной информацией. В целом замечены два типа ошибки обращения к памяти:

==27561== Invalid write of size 4
==27561==    at 0xAA29999: pp_postprocess (postprocess.c:1031)
==27561==    by 0x7FEB511: ff_decode_data (ff_video_decoder.c:1598)
==27561==    by 0x7DA14FA: video_decoder_loop (video_decoder.c:414)
==27561==    by 0x4CC894F: start_thread (pthread_create.c:297)
==27561==    by 0x59B753D: clone (clone.S:130)
==27561==  Address 0x7b51ffc is 892 bytes inside a block of size 893 alloc'd
==27561==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==27561==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==27561==    by 0x80290EC: av_malloc (mem.c:83)
==27561==    by 0x80291C5: av_mallocz (mem.c:156)
==27561==    by 0xAA099A7: reallocBuffers (postprocess.c:893)
==27561==    by 0xAA29606: pp_get_context (postprocess.c:945)
==27561==    by 0x7FEA5D9: pp_change_quality (ff_video_decoder.c:508)
==27561==    by 0x7FEBB60: ff_decode_data (ff_video_decoder.c:560)
==27561==    by 0x7DA14FA: video_decoder_loop (video_decoder.c:414)
==27561==    by 0x4CC894F: start_thread (pthread_create.c:297)
==27561==    by 0x59B753D: clone (clone.S:130)

==27561== Invalid read of size 1
==27561==    at 0xAA0F768: postProcess_MMX2 (postprocess_template.c:3403)
==27561==    by 0xAA29F85: pp_postprocess (postprocess.c:632)
==27561==    by 0x7FEB511: ff_decode_data (ff_video_decoder.c:1598)
==27561==    by 0x7DA14FA: video_decoder_loop (video_decoder.c:414)
==27561==    by 0x4CC894F: start_thread (pthread_create.c:297)
==27561==    by 0x59B753D: clone (clone.S:130)
==27561==  Address 0x72dce87 is 0 bytes after a block of size 967 alloc'd
==27561==    at 0x4027440: memalign (vg_replace_malloc.c:581)
==27561==    by 0x40274FE: posix_memalign (vg_replace_malloc.c:709)
==27561==    by 0x80290EC: av_malloc (mem.c:83)
==27561==    by 0x80291C5: av_mallocz (mem.c:156)
==27561==    by 0xA195E71: ff_alloc_picture (mpegvideo.c:333)
==27561==    by 0xA198090: MPV_frame_start (mpegvideo.c:1221)
==27561==    by 0x9FA21D1: ff_h263_decode_frame (h263dec.c:628)
==27561==    by 0xA269018: avcodec_decode_video2 (utils.c:1152)
==27561==    by 0x7FEB264: ff_decode_data (ff_video_decoder.c:1474)
==27561==    by 0x7DA14FA: video_decoder_loop (video_decoder.c:414)
==27561==    by 0x4CC894F: start_thread (pthread_create.c:297)
==27561==    by 0x59B753D: clone (clone.S:130)

Однако оба типа характеризуются вычислением размера участка памяти в ff_alloc_picture (mpegvideo.c:333) или изменением размера pp_change_quality (ff_video_decoder.c:508) с последующим общим выходом за размер буфера в ff_decode_data (ff_video_decoder.c:1598)
Comment 22 Roman Savochenko 2013-01-06 00:08:30 MSK
И кстати, это всё в libxine!
Comment 23 Roman Savochenko 2013-01-06 00:35:51 MSK
Открыл багу на xine-project.org: https://bugs.xine-project.org/show_bug.cgi?id=491
Comment 24 Roman Savochenko 2013-03-08 19:40:04 MSK
Created attachment 5767 [details]
Обход проблемы доступа за границу выделенной памяти

Данный патч обходит проблему доступа за границу выделенной памяти в ffmpeg, путём выделения на 10% больше памяти, указанием большего размера изображения.

С этим патчем у меня падений нет нигде, хотя там есть ещё одно место обращения за границу памяти, но это только чтение и таким-же образом это не обходится.
Comment 25 Sergey V Turchin 2013-03-11 15:42:37 MSK
Приложу его тогда.
Comment 26 Roman Savochenko 2013-03-11 17:44:19 MSK
(В ответ на комментарий №25)
> Приложу его тогда.
Можно за одно обновить из репозитория, для ветки 1.1. Там ещё были некоторые исправления, после релиза 1.1.21, которые однако этой проблемы не исправляли.
Comment 27 Sergey V Turchin 2013-03-11 18:01:57 MSK
(В ответ на комментарий №26)
> Можно за одно обновить из репозитория, для ветки 1.1
Ок, только уже следующим таском. Уже собирается.
Comment 28 Repository Robot 2013-03-11 18:06:01 MSK
libxine-1.1.21-alt5 -> sisyphus:

* Mon Mar 11 2013 Sergey V Turchin <zerg@altlinux> 1.1.21-alt5
- add woraround against crash; thanks rom_as@alt (ALT#27505)