Bug 487

Summary: Не работает календарь в СБИС
Product: WINE@Etersoft Reporter: Константин Кондратюк <kondratyuk>
Component: ОбщееAssignee: Сергей Гуральник <serhio>
Status: CLOSED FIXED QA Contact: Svetlana Zhukova <svzhu>
Severity: critical    
Priority: P1 CC: amorozov, baraka, DjSpiker, lav, mid, pglushkov, sonner
Version: 1.0.7   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: 14540,22718 Связано с:
Дата напоминания:
Bug Depends on: 650, 1202    
Bug Blocks: 384, 502, 8500    
Deadline: 2012-04-30   
Attachments: Лог по msg, win и process

Description Константин Кондратюк 2007-02-26 20:12:55 MSK
Программа для работы с налоговой отчетностью:
http://sbis.ru/download/2.1/sbis-setup-eo-nokladr.exe

Зависание при обращении к календарю. Происходит только при клике мышкой в число на календаре. Это очень неприятно, но работа возможна, если указывать дату с клавиатуры.
Comment 1 Константин Кондратюк 2007-02-28 14:21:24 MSK
При запуске через wine-origin получаем такой backtrace:

Backtrace:
=>1 0x7ee489f5 INSTR_EmulateInstruction+0x65(rec=0x34d8d8, context=0x34d60c) [/net/wine/Projects/wine-origin/dlls/kernel32/instr.c:454] in kernel32 (0x0034d4ec)
  2 0x7ee49e6c INSTR_vectored_handler+0x5c(ptrs=0x34d554) [/net/wine/Projects/wine-origin/dlls/kernel32/instr.c:890] in kernel32 (0x0034d51c)
  3 0x7ef9ffe2 raise_exception+0x112(rec=0x34d8d8, context=0x34d60c, first_chance=<is not available>) [/net/wine/Projects/wine-origin/dlls/ntdll/exception.c:233] in ntdll (0x0034d56c)
  4 0x7efa03c6 __regs_RtlRaiseException+0x26(rec=0x34d8d8, context=0x34d60c) [/net/wine/Projects/wine-origin/dlls/ntdll/exception.c:380] in ntdll (0x0034d5cc)
  5 0x7efc4054 raise_segv_exception+0x34(rec=<register ESI not in topmost frame>, context=<register EDI not in topmost frame>) [/net/wine/Projects/wine-origin/dlls/ntdll/signal_i386.c:1001] in ntdll (0x0034d5fc)
  6 0xdeadbabe (0x0034fcac)
  7 0x00403941 in sbis (+0x3941) (0x0034fe60)
  8 0x00404a80 in sbis (+0x4a80) (0x0034ff08)
  9 0x7ee67f10 start_process+0xc0(arg=0x0) [/net/wine/Projects/wine-origin/dlls/kernel32/process.c:820] in kernel32 (0x0034ffe8)
  10 0xb7dfa677 wine_switch_to_stack+0x17() in libwine.so.1 (0x00000000)
0x7ee489f5 INSTR_EmulateInstruction+0x65 [/net/wine/Projects/wine-origin/dlls/kernel32/instr.c:454] in kernel32: movb   0x0(%edi,%edx,1),%al
Unable to open file '/net/wine/Projects/wine-origin/dlls/kernel32/instr.c'

Или stack overflow при запуске через wine
Comment 2 Vitaly Lipatov 2007-03-04 19:57:23 MSK
Как мне кажется, происходит генерация исключения при старте процесса.
Нужно обратиться к разработчикам СБИС за консультацией.
Comment 3 Константин Кондратюк 2007-03-29 19:47:26 MSD
Created attachment 98 [details]
Лог по msg, win и process
Comment 4 Глушков Пётр 2007-05-03 18:56:02 MSD
 Конкретное решение под СБИС++ найдено
Comment 5 Глушков Пётр 2007-05-03 19:30:49 MSD
 В функции MONTHCAL_LButtonDown при условии клика в дату (MCHT_CALENDARDATE) не посылется сообщение WM_NOTIFY родителю в случае, если класс контрола, обрабатывающего клик - "Календарь", внутренний класс СБИС.
Comment 6 Анатолий Лютин 2007-08-22 16:25:11 MSD
Данное решение некорректно. Ломает работу календаря. Откладываю данный хак и переоткрываю.
Comment 7 Глушков Пётр 2007-10-01 11:52:45 MSD
на данный момент ведется работа по исправлению мелких интерфейсных багов всех контролов работающих с временем, датой...
Comment 8 Vitaly Lipatov 2007-12-28 21:25:19 MSK
1. Нужны тесты по поднятой теме
2. Надо проверить на новой версии программы
3. Плавно исправить к новой версии
Comment 9 Денис Баранов 2008-03-18 22:21:56 MSK
Удалось воспроизвести в новой версии СБИС++ 2.2.130

Backtrace:
=>1 0xb7dc35b6 strlen+0x26() in libc.so.6 (0x7fdef658)
  2 0x7f8965e0 ShellExecuteExA+0x250() in shell32 (0x7fdef6d8)
Comment 10 Константин Кондратюк 2008-11-14 22:58:24 MSK
Нужно посмотреть при работе над 1.0.10
Comment 11 Денис Баранов 2008-11-22 21:34:31 MSK
eter35\13:

wine: Unhandled page fault on read access to 0x7cf9f3e7 at address 0xb7d64156 (thread 0009), starting debugger...
Unhandled exception: page fault on read access to 0x7cf9f3e7 in 32-bit code (0xb7d64156).
Register dump:
 CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
 EIP:b7d64156 ESP:0032f634 EBP:0032f670 EFLAGS:00010206(   - 00      - RIP1)
 EAX:7cf9f3e7 EBX:7b8b3c1c ECX:00000003 EDX:00000003
 ESI:00000000 EDI:ffffffff
Stack dump:
0x0032f634:  7b85fa14 7cf9f3e7 00000000 00000000
0x0032f644:  00000000 00000000 00000000 00000000
0x0032f654:  7bc636bb 7ed54c50 104f3d28 0032f6bc
0x0032f664:  7e9d42c0 104f3d28 7cf9f3e7 0032f6f0
0x0032f674:  7e9a58e8 00000000 00000000 7cf9f3e7
0x0032f684:  ffffffff 00000000 00000000 00070030
Backtrace:
=>1 0xb7d64156 strlen+0x26() in libc.so.6 (0x0032f670)
  2 0x7e9a58e8 ShellExecuteExA+0xb8() in shell32 (0x0032f6f0)
Comment 12 Абросимов Виктор 2010-04-25 23:44:32 MSD
wine@etersoft 1.0.12 eter5.2/4  Сбис версия 2.3.37. 
Открыл календарь попробовал выбрать любую дату и программа зависла.
Comment 13 Глеб Кордюков 2010-06-10 16:55:48 MSD
Обсуждение с разработчиками: http://forum.sbis.ru/viewtopic.php?f=3&t=15093
Comment 14 Константин Кондратюк 2011-12-06 20:18:46 MSK
WINE@Etersoft 1.0 SQL 2.0.0-eter0.12/2

Воспроизводится.
Comment 15 Константин Кондратюк 2011-12-06 21:16:26 MSK
По мотивам исследования Пети (коммент #5)...

В функции MONTHCAL_LButtonDown при обработке сообщения MCHT_CALENDARDATE всё так же есть код, выполнение которого связано с падением. Судя по всему, падения - это последствия:
infoPtr->status = MC_SEL_LBUTDOWN;

На первый взгляд, обработка MC_SEL_LBUTDOWN есть только в MONTHCAL_MouseMove():
  if(!(infoPtr->status & MC_SEL_LBUTDOWN)) return 0;
Comment 16 Константин Кондратюк 2011-12-07 12:54:36 MSK
Статус MC_SEL_LBUTDOWN обрабатывается самой программой, конечно, а не вайном.
Comment 17 Александр Морозов 2011-12-08 21:02:50 MSK
СБиС++ ЭО создаёт окно календаря и устанавливает свою оконную процедуру (fffffffc = -4 = GWL_WNDPROC):
003f:Call user32.CreateWindowExA(00000000,0091dc18 "SysMonthCal32",10096308 "",44810001,00000000,00000000,000000d0,000000d2,0009020c,00000000,00400000,00000000) ret=00766596
......................
003f:Ret  user32.CreateWindowExA() retval=000f002c ret=00766596
003f:Call user32.GetClassLongA(000f002c,ffffffe8) ret=007665dc
003f:Ret  user32.GetClassLongA() retval=ffff0016 ret=007665dc
003f:Call user32.SetWindowLongA(000f002c,fffffffc,00762f50) ret=00763400
003f:Ret  user32.SetWindowLongA() retval=ffff0016 ret=00763400

После щелчка мышью на дате происходит падение внутри этой процедуры:
003f:Call window proc 0x762f50 (hwnd=0x9020c,msg=WM_NOTIFY,wp=00000000,lp=0032e094)
......................
003f:Call user32.GetWindow(000f002c,00000002) ret=005a895a
003f:Ret  user32.GetWindow() retval=00080276 ret=005a895a
003f:Call user32.GetWindow(00080276,00000002) ret=005a895a
003f:Ret  user32.GetWindow() retval=00000000 ret=005a895a
err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x512de1
Comment 22 Сергей Гуральник 2012-08-13 11:30:37 MSK
(В ответ на comment #0)
> Программа для работы с налоговой отчетностью:
> http://sbis.ru/download/2.1/sbis-setup-eo-nokladr.exe
> 
> Зависание при обращении к календарю. Происходит только при клике мышкой в число
> на календаре. Это очень неприятно, но работа возможна, если указывать дату с
> клавиатуры.

Зависание происходит не только при выборе числа, но и при попытке изменить месяц или год.
С "comctl32=n" (версии 6.0) проблемы нет. Хотя есть мелкий дефект перерисовки, но видимо он не относится к задаче.
Comment 23 Сергей Гуральник 2012-08-13 16:57:27 MSK
Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем структуры NMSELCHANGE заполняется перед вызовом корректно.
Comment 24 Сергей Гуральник 2012-08-14 17:50:19 MSK
(В ответ на comment #23)
> Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и
> MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем
> структуры NMSELCHANGE заполняется перед вызовом корректно.

Эти функции вызывают зависание при вызове из разнообразных мест системной оконной процедуры. В логах оконных сообщений под Windows ничего особенного нет.
Comment 25 Сергей Гуральник 2012-08-15 14:43:48 MSK
(В ответ на comment #23)
> Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и
> MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем
> структуры NMSELCHANGE заполняется перед вызовом корректно.

Кажется ошибка именно здесь. В Windows член stSelEnd забивается нулями перед посылкой WM_NOTIFY если у календаря не установлен бит MCS_MULTISELECT. В Вайне же в него всегда записывается некоторая дата.
Обнуление указанной выше структуры решает проблему.
Comment 26 Сергей Гуральник 2012-08-15 22:06:31 MSK
(В ответ на comment #25)
> (В ответ на comment #23)
> > Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и
> > MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем
> > структуры NMSELCHANGE заполняется перед вызовом корректно.
> 
> Кажется ошибка именно здесь. В Windows член stSelEnd забивается нулями перед
> посылкой WM_NOTIFY если у календаря не установлен бит MCS_MULTISELECT. В Вайне
> же в него всегда записывается некоторая дата.
> Обнуление указанной выше структуры решает проблему.

Для проверки на СБИС запущенном в Windows скопировал stSelStart в stSelEnd перед обработкой сообщения. Результат - немедленный acess violation on write где-то внутри muzzle.dll. Думаю выводы очевидны.
Comment 27 Сергей Гуральник 2012-08-16 18:37:00 MSK
Сделал тест и соответствующее исправление, отправил на winehq.org
Comment 28 Сергей Гуральник 2012-08-17 11:04:54 MSK
(В ответ на comment #27)
> Сделал тест и соответствующее исправление, отправил на winehq.org

Тесты прошли с ошибками. Исправил и отправил повторно.
http://www.winehq.org/pipermail/wine-patches/2012-August/117044.html
http://www.winehq.org/pipermail/wine-patches/2012-August/117045.html
Comment 29 Сергей Гуральник 2012-08-20 10:10:32 MSK
(В ответ на comment #28)
> (В ответ на comment #27)
> > Сделал тест и соответствующее исправление, отправил на winehq.org
> 
> Тесты прошли с ошибками. Исправил и отправил повторно.
> http://www.winehq.org/pipermail/wine-patches/2012-August/117044.html
> http://www.winehq.org/pipermail/wine-patches/2012-August/117045.html

Патчи приняты, отправил в eter-2.0.0. Можно проверить решение.
Comment 30 Svetlana Zhukova 2012-08-31 10:59:33 MSK
Например: СБИС - календарь налогоплательщика - ОСН - далее - действует с  - нажимаем значек календаря(таблицы) - выбираем любую дату. Зависаний нет, работает корректно.
wine@eter-2 bottle sbis/2.4.43
WINE@Etersoft SQL 2.0.2-eter15/3