Summary: | Падение wine на X11DRV_DIB_Lock | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Илья Шпигорь <shpigor> |
Component: | Графика GDI / DIB / GDIPLUS | Assignee: | Sergei Novosyolov <chi> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | major | ||
Priority: | P3 | CC: | chi, lav, vitperov |
Version: | 1.0.10 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 1840 |
Description
Илья Шпигорь
2009-03-19 12:42:16 MSK
Если использовать библиотеку wine oleaut32, то ошибка не проявляется. По умолчанию эта библиотека сторонняя, т.е. от microsoft. Проблема, вероятно, в том, что в WinAPI функции StretchBlt вызывается функция драйвера DC назначения. Т.е. если идет копирование из памяти в X, то вызывается X11DRV_StretchBlt. Ей в качестве источника задается dib устройство, но X-ы об этом не знают и работают с ним как с X устройством. Выложил тест, имитирующий падение. Он есть в архиве: http://lists.etersoft.ru/pipermail/wine-patches/2009-March/000360.html Кстати, тест падает в любом случае, не зависимо от того, какая используется библиотека oleaut32 - встроенная или сторонняя. To Илья: исправлена функция Stretchblt, обнови гит и проверь 1с еще раз. Если падать перестанет, закрывай багу. После приложения патча: Fix StretchBlt (blitting between X and DIB physDevices) wine перестал запускаться. Выдается ошибка: err:module:attach_process_dlls "shell32.dll" failed to initialize, aborting Причем некоторые тесты нормально отрабатывают (например dlls/gdi32/tests), а приложения вроде winver, winefile, notepad нет. При откате патча все снова работает нормально. Ошибка с shell32 библиотекой происходит в результате вызова в функции BITBLT_ConvertDIBtoDDB: memcpy( &bmi->bmiHeader, &srcBmpObj->dib->dsBmih, sizeof(BITMAPINFOHEADER) ); если BITBLT_ConvertDIBtoDDB вызывалась из StretchBlt. Выложил патч. Решение заключается в проверке DIBSECTION объекта srcBmpObj на NULL в функции BITBLT_ConvertDIBtoDDB. Без этого происходит падение wine, т.к. в последующем вызове memcpy выполняется попытка перехода по указателю: srcBmpObj->dib->dsBmih. Падать wine перестал, но возможны проблемы с корректной отрисовкой картинок. |