Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 3687 - Падение wine на X11DRV_DIB_Lock   Make a simular bug
Summary: Падение wine на X11DRV_DIB_Lock
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: GDI / DIB / GDIPLUS ; графика (show other bugs)
Version: 1.0.10
Hardware: PC All
: P3 major
Target Milestone: ---
Assignee: Sergei Novosyolov
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 1840
  Show dependency treegraph
 
In work:
Reported: 2009-03-19 12:42 MSK by Илья Шпигорь
Modified: 2009-10-13 13:25 MSD (History)
3 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Илья Шпигорь 2009-03-19 12:42:16 MSK
Ошибка проявляется при работе в 1с. После открытия нескольких форм wine падает.

Backtrace:
=>0 0x7e6b7bcc X11DRV_DIB_Lock+0x1e(physBitmap=0x7fff, req=2) [/srv/shpigor/Projects/eterdib/dlls/winex11.drv/dib.c:4556] in winex11 (0x0032edec)
  1 0x7e6a5081 X11DRV_StretchBlt+0x46(physDevDst=0x1a8c20, xDst=3, yDst=3, widthDst=13, heightDst=15, physDevSrc=<register EDI not in topmost frame>, xSrc=0, ySrc=396, widthSrc=423, heightSrc=-397, rop=<register ESI not in topmost frame>) [/srv/shpigor/Projects/eterdib/dlls/winex11.drv/bitblt.c:1761] in winex11 (0x0032ee2c)
  2 0x7ebeec8a StretchBlt+0xcd(hdcDst=0x1868, xDst=3, yDst=3, widthDst=13, heightDst=15, hdcSrc=0x6588, xSrc=0, ySrc=396, widthSrc=423, heightSrc=-397, rop=13369376) [/srv/shpigor/Projects/eterdib/dlls/gdi32/bitblt.c:329] in gdi32 (0x0032eeec)
err:dbghelp:pe_load_dbg_file Couldn't find .DBG file "oleaut32.dbg" ("4\xee3")
  3 0x6539e5de in oleaut32 (+0x5e5de) (0x00006588)
  4 0x00000000 (0x00000000)
0x7e6b7bcc X11DRV_DIB_Lock+0x1e [/srv/shpigor/Projects/eterdib/dlls/winex11.drv/dib.c:4556] in winex11: movl    0x18(%eax),%eax

Более простой способ воспроизведения - запуск winver. Wine падает с аналогичным backtrace, так же на X11DRV_DIB_Lock.
Comment 1 Илья Шпигорь 2009-03-19 14:39:51 MSK
Если использовать библиотеку wine oleaut32, то ошибка не проявляется. По умолчанию эта библиотека сторонняя, т.е. от microsoft.
Comment 2 Илья Шпигорь 2009-03-19 14:44:40 MSK
Проблема, вероятно, в том, что в WinAPI функции StretchBlt вызывается функция драйвера DC назначения. Т.е. если идет копирование из памяти в X, то вызывается X11DRV_StretchBlt. Ей в качестве источника задается dib устройство, но X-ы об этом не знают и работают с ним как с X устройством.
Comment 3 Илья Шпигорь 2009-03-19 16:02:00 MSK
Выложил тест, имитирующий падение.

Он есть в архиве:
http://lists.etersoft.ru/pipermail/wine-patches/2009-March/000360.html

Кстати, тест падает в любом случае, не зависимо от того, какая используется библиотека oleaut32 - встроенная или сторонняя.
Comment 4 Sergei Novosyolov 2009-03-19 18:27:08 MSK
To Илья: исправлена функция Stretchblt, обнови гит и проверь 1с еще раз. Если падать перестанет, закрывай багу.
Comment 5 Илья Шпигорь 2009-03-24 12:28:37 MSK
После приложения патча:

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 нет.

При откате патча все снова работает нормально.
Comment 6 Илья Шпигорь 2009-03-24 17:16:48 MSK
Ошибка с shell32 библиотекой происходит в результате вызова в функции BITBLT_ConvertDIBtoDDB:

memcpy( &bmi->bmiHeader, &srcBmpObj->dib->dsBmih, sizeof(BITMAPINFOHEADER) );

если BITBLT_ConvertDIBtoDDB вызывалась из StretchBlt.
Comment 7 Илья Шпигорь 2009-03-25 14:25:21 MSK
Выложил патч.

Решение заключается в проверке DIBSECTION объекта srcBmpObj на NULL в функции BITBLT_ConvertDIBtoDDB. Без этого происходит падение wine, т.к. в последующем вызове memcpy выполняется попытка перехода по указателю: srcBmpObj->dib->dsBmih. 

Падать wine перестал, но возможны проблемы с корректной отрисовкой картинок.