=== Бага создана копированием баги 5293 === (В ответ на comment #48) > в git WINE@Etersoft version 1.3.13-eter1.4 > программа вообще не запускается. Нужно ещё раз проверить в свежей бутылке.
Программу устанавливала в бутылке, а также как вариант путем переноса установленной из 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)
Created attachment 2192 [details] ошибка ошибка
WINE@Etersoft version 1.3.13-eter1.6 бутылка wine@cellar bottle bugs/7199
Разобрался. Проблема происходит при попытке загрузки курсора из файла. Проверка на то правильный ли это файл не производится, поэтому происходит падение
Сделал патч, добавляющий проверку idType перед загрузкой курсора. Программа работает! Пока делаю патч для winehq. Для нас патч сделаю позже, когда будет ясно примут ли его в winehq.
Подготовил патч. Отправил в winehq.
Патч сделан не совсем корректно. Выяснилось, что курсоры могут быть ещё и анимированные. Поэтому загружать только курсоры с idType=2 неправильно.
Описание возможных вариантов поля idType http://msdn.microsoft.com/en-us/library/ms648045%28v=vs.85%29.aspx пояснение полей структуры icon. http://msdn.microsoft.com/en-us/library/ms997538.aspx
Открыл вручную файл, который пыталась открыть программа. Это оказалась jpg картинка. Можно попробовать проверять сигнатуру файла. И при обнаружении картинки выдавать предупреждение. Проверил на WinXP картинка с помощью этой функции грузиться не должна. Скорее всего это ошибка программы.
Переделал патч. Отправил в winehq
Переделал патч. Теперь, вместо проверки на сигнатуру JPG проверяется сигнатура icon/cursor/bitmap. У всех этих сигнатур первые 2 байта нулевые. Прочитать их можно и через структуру CURSORICONFILEDIR, они как-раз соответствуют полю idReserved.
дистрибутив тут: /Windows/Учётные, бухгалтерские/CheckXML бутылка wine@cellar bottle bugs/7199-1 WINE@Etersoft 1.0 SQL 1.0.12-eter11.13/21 Установилось без ошибок. Запускаем тестирование -- тестирование файла 2-НДФЛ -- и затем просмотр. Все корректно.
Рано проверять. Патча ещё нет. В 1.0.12 итак всё работает. А для eterhack патч ещё не делал
Патч отказываются принимать в winehq без тестов. Посмотрел стандартные тесты для этой функции. Оказывается тесты на загрузку jpg, gif, bmp и png уже есть. И падения при их открытии не происходит. Значит дело всё-таки в конкретной картинке.
Проверил на другой картинке. Тоже падает. Теперь осталось сделать картинку минимального размера, воспроизводящую падение.
Размер 10х8 - не падает Размер 50х40 - не падает Размер 100х80 - не падает Размер 200х161 - не падает Размер 400х321, 42кБ - не падает Размер 600х482, 81кБ - Падает!
Размер 600х482, 81кБ - Падает! Размер 600х482, 41кБ - не падает. Значит разрешение тут не причём, всё зависит от размера файла.
Маленькие файлы не загружаются, потому что не срабатывает условие: if ( filesize < (sizeof(*dir) + sizeof(dir->idEntries[0])*(dir->idCount-1)) ) goto end; Т.е получается, что изначально поля dir->idEntries[0] и dir->idCount неправильные. Но если размер файл достаточно большой, чтобы превысить это значение, то проверка проходит.
Ещё проблема в том, что для bmp рассматриваемая функция должна работать. BMP: Reserved=19778, Type=70, Count=0 Reserved=19778, Type=38, Count=0 JPG: Reserved=55551, Type=57599, Count=4096 притом для разных файлов значения одинаковые.
Для bmp все тесты проходят потому, что idCount попадает на поле idReserved, которое всегда 0
Не принимают. Нужны тесты. После обсуждения стало ясно. 1) Надо добавить тесты, охватывающие как можно больше вариантов входных данных. В нашем случае, как я понимаю, придётся делать тесты для jpg, png, bmp, gif. 2) Тесты могут вызывать падения. Но в этом случае их надо отправлять в одном файле с патчем (который эти падения исправляет) 3) Большие файлы надо генерировать. При этом они не обязательно должны быть корректными.
Сделал черновую версию тестов. Для этого беру уже готовые шаблоны файлов, и дописываю в конец требуемое количество нулей. Пока использую константу 80000. Для jpg и png это приводит к падению. Для gif - нет.
с gif небольшие проблемы. Попробовал файл размером 50 Мб. Тесты выполняются ужасно долго. Но всё ещё не падает. Нужен файл ещё больше. Пока два варианта: 1) не писать тест на gif вообще. 2) изменить байты после сигнатуры файла, чтобы уменьшить максимальный размер. Так же можно попробовать сделать подобное и для других типов, например для jpg и png. Возможно это будет более простым решением, воспроизводящим проблему
Переделал тесты. Брал исходные структуры однопиксельных изображений, и менял там два байта, соответствующие размеру. Таки образом получилось воспроизвести проблему не прибегая к большим изображениям. Работает для jpg, bmp и gif. Для png почему-то падения не происходит.
Условие: if ( filesize < (sizeof(*dir) + sizeof(dir->idEntries[0])*(dir->idCount-1)) ) goto end; для png файлов не выполняется, что приводит к дальнейшему выполнению кода. Однако, падения дальше не происходит. Если увеличить idCount до 2, то то можно добиться падения.
Сделал финальную версию патча. Проверил на winXP и win2k. Тесты работают.
отправил окончательную версию в winehq
Переделал патч с учётом замечаний
Пока патч не принимают. Отправил патч в eterwine и eterhack. Можно проверять. Закрывать багу пока не надо, потом перевесить обратно на меня.
wine@eterhack bottle 1c/bug42 WINE@Etersoft 1.0 SQL 1.3.27/1.7.1-eter1.10/3 Запускаем тестирование -- тестирование файла 2-НДФЛ -- и затем просмотр. Открывается пустое окошко формы. Воспроизвелось.
Проверить на W@E 2.0, 2.1
Запускаем тестирование -- тестирование файла 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,окошко отображается корректно,ошибок нет.
закрываю(не заметила,что приемка тоже моя).