Bug 7199

Summary: CheckXML + Отрисовка окна отчетов
Product: WINE@Etersoft Reporter: Виталий Перов <vitperov>
Component: Internet Explorer / GeckoAssignee: Svetlana Zhukova <svzhu>
Status: CLOSED FIXED QA Contact: Svetlana Zhukova <svzhu>
Severity: minor    
Priority: P5 CC: baraka, lav, night, sonner
Version: 2.0Keywords: TO_WINEHQ
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 3130, 5293    
Bug Blocks: 8900    
Attachments: ошибка

Description Виталий Перов 2011-04-26 16:34:22 MSK
=== Бага создана копированием баги 5293 ===

(В ответ на comment #48)
> в git  WINE@Etersoft version 1.3.13-eter1.4
> программа вообще не запускается.

Нужно ещё раз проверить в свежей бутылке.
Comment 1 Svetlana Zhukova 2011-04-28 16:13:00 MSK
Программу устанавливала в бутылке, а также как вариант путем переноса установленной из windows.В конце установки появляется сообщение (см. приложение ОШИБКА.При запуске программы та же ошибка.


Register dump:
 CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
 EIP:684365f2 ESP:0032d51c EBP:0032d520 EFLAGS:00010286(  R- --  I S - -P- )
 EAX:0032d56c EBX:684dcff4 ECX:00000046 EDX:ed3b0000
 ESI:0000004a EDI:0032d574
Stack dump:
0x0032d51c:  00000000 0032d590 684371e2 003c0000
0x0032d52c:  00000000 0032d574 0032d570 0032d56c
0x0032d53c:  003c0000 00011538 00000000 684dcff4
0x0032d54c:  00000000 ffffffff 00000000 0032d56c
0x0032d55c:  0032d570 684365c0 003c0000 00000000
0x0032d56c:  00000000 00000046 0000004a 00000000
Backtrace:
=>0 0x684365f2 CURSORICON_GetFileEntry+0x32(dir=0x3c0000, n=0, width=0x32d574, height=0x32d570, bits=0x32d56c) [/home/svzhu/Projects/eterhack/dlls/user32/cursoricon.c:595] in user32 (0x0032d590)
  1 0x684371e2 CURSORICON_FindBestCursor.clone+0xb1() in user32 (0x0032d660)
  2 0x68437ee6 CURSORICON_Load+0xf5(hInstance=<is not available>, name="c:\windows\temp\19vf0007.tmp", width=0, height=0, depth=0x1, fCursor=0x1, loadflags=0x50) [/home/svzhu/Projects/eterhack/dlls/user32/cursoricon.c:603] in user32 (0x0032d770)
  3 0x6843a8ab LoadImageW+0xea(hinst=(nil), name="c:\windows\temp\19vf0007.tmp", type=0x2, desiredx=0, desiredy=0, loadflags=0x50) [/home/svzhu/Projects/eterhack/dlls/user32/cursoricon.c:2326] in user32 (0x0032d860)
  4 0x6843b396 LoadImageA+0x125(hinst=(nil), name="c:\windows\temp\19vf0007.tmp", type=0x2, desiredx=0, desiredy=0, loadflags=0x50) [/home/svzhu/Projects/eterhack/dlls/user32/cursoricon.c:2281] in user32 (0x0032d890)
  5 0x6843b571 LoadCursorFromFileA+0x90(name="c:\windows\temp\19vf0007.tmp") [/home/svzhu/Projects/eterhack/dlls/user32/cursoricon.c:1645] in user32 (0x0032db24)
  6 0x0c121e26 in vfp8r (+0x121e25) (0x0032dcd0)
  7 0x0c0cd6c0 in vfp8r (+0xcd6bf) (0x0032de7c)
  8 0x0c0341af in vfp8r (+0x341ae) (0x0032de9c)
Comment 2 Svetlana Zhukova 2011-04-28 16:13:35 MSK
Created attachment 2192 [details]
ошибка

ошибка
Comment 3 Svetlana Zhukova 2011-04-28 16:16:06 MSK
WINE@Etersoft version 1.3.13-eter1.6

бутылка wine@cellar bottle bugs/7199
Comment 5 Виталий Перов 2011-06-29 14:44:24 MSK
Разобрался.

Проблема происходит при попытке загрузки курсора из файла.
Проверка на то правильный ли это файл не производится, поэтому происходит падение
Comment 6 Виталий Перов 2011-06-29 15:29:03 MSK
Сделал патч, добавляющий проверку idType перед загрузкой курсора.
Программа работает!

Пока делаю патч для winehq.

Для нас патч сделаю позже, когда будет ясно примут ли его в winehq.
Comment 7 Виталий Перов 2011-06-29 15:52:09 MSK
Подготовил патч. Отправил в winehq.
Comment 8 Виталий Перов 2011-06-30 14:21:26 MSK
Патч сделан не совсем корректно. Выяснилось, что курсоры могут быть ещё и анимированные. Поэтому загружать только курсоры с idType=2 неправильно.
Comment 9 Виталий Перов 2011-07-01 13:40:39 MSK
Описание возможных вариантов поля idType
http://msdn.microsoft.com/en-us/library/ms648045%28v=vs.85%29.aspx

пояснение полей структуры icon.
http://msdn.microsoft.com/en-us/library/ms997538.aspx
Comment 10 Виталий Перов 2011-07-01 15:00:24 MSK
Открыл вручную файл, который пыталась открыть программа. Это оказалась jpg картинка.

Можно попробовать проверять сигнатуру файла. И при обнаружении картинки выдавать предупреждение.

Проверил на WinXP картинка с помощью этой функции грузиться не должна. Скорее всего это ошибка программы.
Comment 11 Виталий Перов 2011-07-01 15:40:25 MSK
Переделал патч. Отправил в winehq
Comment 12 Виталий Перов 2011-07-02 16:39:51 MSK
Переделал патч. Теперь, вместо проверки на сигнатуру JPG проверяется сигнатура icon/cursor/bitmap. У всех этих сигнатур первые 2 байта нулевые. Прочитать их можно и через структуру CURSORICONFILEDIR, они как-раз соответствуют полю idReserved.
Comment 13 Svetlana Zhukova 2011-07-05 11:28:10 MSK
дистрибутив тут: /Windows/Учётные, бухгалтерские/CheckXML

бутылка wine@cellar bottle bugs/7199-1

WINE@Etersoft 1.0 SQL 1.0.12-eter11.13/21
Установилось без ошибок.
Запускаем тестирование -- тестирование файла 2-НДФЛ -- и затем просмотр.
Все корректно.
Comment 14 Виталий Перов 2011-07-10 19:56:21 MSK
Рано проверять. Патча ещё нет. В 1.0.12 итак всё работает.
А для eterhack патч ещё не делал
Comment 15 Виталий Перов 2011-07-25 14:04:27 MSK
Патч отказываются принимать в winehq без тестов.

Посмотрел стандартные тесты для этой функции.
Оказывается тесты на загрузку jpg, gif, bmp и png уже есть. И падения при их открытии не происходит. Значит дело всё-таки в конкретной картинке.
Comment 16 Виталий Перов 2011-07-25 19:46:12 MSK
Проверил на другой картинке. Тоже падает.
Теперь осталось сделать картинку минимального размера, воспроизводящую падение.
Comment 17 Виталий Перов 2011-07-25 20:30:57 MSK
Размер 10х8 - не падает
Размер 50х40 - не падает
Размер 100х80 - не падает
Размер 200х161 - не падает
Размер 400х321, 42кБ - не падает
Размер 600х482, 81кБ - Падает!
Comment 18 Виталий Перов 2011-07-25 20:42:55 MSK
Размер 600х482, 81кБ - Падает!
Размер 600х482, 41кБ - не падает.

Значит разрешение тут не причём, всё зависит от размера файла.
Comment 19 Виталий Перов 2011-07-27 16:29:38 MSK
Маленькие файлы не загружаются, потому что не срабатывает условие:

if ( filesize < (sizeof(*dir) + sizeof(dir->idEntries[0])*(dir->idCount-1)) )
    goto end;

Т.е получается, что изначально поля dir->idEntries[0] и dir->idCount неправильные. Но если размер файл достаточно большой, чтобы превысить это значение, то проверка проходит.
Comment 20 Виталий Перов 2011-07-27 16:46:37 MSK
Ещё проблема в том, что для bmp рассматриваемая функция должна работать.

BMP:
Reserved=19778, Type=70, Count=0
Reserved=19778, Type=38, Count=0

JPG:
Reserved=55551, Type=57599, Count=4096
притом для разных файлов значения одинаковые.
Comment 21 Виталий Перов 2011-07-27 17:06:22 MSK
Для bmp все тесты проходят потому, что idCount попадает на поле idReserved, которое всегда 0
Comment 22 Виталий Перов 2011-07-27 18:20:28 MSK
Переделал патч. Отправил в winehq
Comment 23 Виталий Перов 2011-08-01 17:01:50 MSK
Не принимают. Нужны тесты.

После обсуждения стало ясно.
1) Надо добавить тесты, охватывающие как можно больше вариантов входных данных.
В нашем случае, как я понимаю, придётся делать тесты для jpg, png, bmp, gif.

2) Тесты могут вызывать падения. Но в этом случае их надо отправлять в одном файле с патчем (который эти падения исправляет)

3) Большие файлы надо генерировать. При этом они не обязательно должны быть корректными.
Comment 24 Виталий Перов 2011-08-01 21:04:01 MSK
Сделал черновую версию тестов.
Для этого беру уже готовые шаблоны файлов, и дописываю в конец требуемое количество нулей.

Пока использую константу 80000. Для jpg и png это приводит к падению. Для gif - нет.
Comment 25 Виталий Перов 2011-08-02 15:23:31 MSK
с gif небольшие проблемы.
Попробовал файл размером 50 Мб. Тесты выполняются ужасно долго.
Но всё ещё не падает. Нужен файл ещё больше.
Пока два варианта:
1) не писать тест на gif вообще.
2) изменить байты после сигнатуры файла, чтобы уменьшить максимальный размер.
Так же можно попробовать сделать подобное и для других типов, например для jpg и png. Возможно это будет более простым решением, воспроизводящим проблему
Comment 26 Виталий Перов 2011-08-02 19:12:12 MSK
Переделал тесты.
Брал исходные структуры однопиксельных изображений, и менял там два байта, соответствующие размеру.
Таки образом получилось воспроизвести проблему не прибегая к большим изображениям.

Работает для jpg, bmp и gif. Для png почему-то падения не происходит.
Comment 27 Виталий Перов 2011-08-02 19:31:16 MSK
Условие:
if ( filesize < (sizeof(*dir) + sizeof(dir->idEntries[0])*(dir->idCount-1)) )
    goto end;
для png файлов не выполняется, что приводит к дальнейшему выполнению кода.
Однако, падения дальше не происходит.

Если увеличить idCount до 2, то то можно добиться падения.
Comment 28 Виталий Перов 2011-08-02 20:44:07 MSK
Сделал финальную версию патча.
Проверил на winXP и win2k. Тесты работают.
Comment 29 Виталий Перов 2011-08-02 21:06:37 MSK
отправил окончательную версию в winehq
Comment 30 Виталий Перов 2011-08-03 22:36:03 MSK
Переделал патч с учётом замечаний
Comment 31 Виталий Перов 2011-08-24 15:29:38 MSK
Пока патч не принимают. Отправил патч в eterwine и eterhack.

Можно проверять.

Закрывать багу пока не надо, потом перевесить обратно на меня.
Comment 32 Svetlana Zhukova 2011-09-09 14:10:57 MSK
wine@eterhack bottle 1c/bug42
WINE@Etersoft 1.0 SQL 1.3.27/1.7.1-eter1.10/3

Запускаем тестирование -- тестирование файла 2-НДФЛ -- и затем просмотр.
Открывается пустое окошко формы.
Воспроизвелось.
Comment 33 Денис Баранов 2013-05-17 18:14:37 MSK
Проверить на W@E 2.0, 2.1
Comment 34 Svetlana Zhukova 2013-05-27 12:54:42 MSK
Запускаем тестирование -- тестирование файла 2-НДФЛ -файл tmpxsl.xml (на с:)
swine -h eter-2.0 bugs/7199
2.0.4/2.0.3-eter2/5
А также 
bugs/7199
2.1.2/2.1.0-eter14/3
Проблемы нет, все аналогично работы в windows,окошко отображается корректно,ошибок нет.
Comment 35 Svetlana Zhukova 2013-05-27 12:55:20 MSK
закрываю(не заметила,что приемка тоже моя).