Bug 1317

Summary: Тест к функции FDICopy()
Product: WINE@Etersoft Reporter: Константин Кондратюк <kondratyuk>
Component: ОбщееAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P5 CC: lav
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 930, 7107    
Attachments: Пример cab-файла
дописал тест wine/dlls/cabinet/tests/fdi.c

Description Константин Кондратюк 2008-03-07 14:12:42 MSK
Created attachment 295 [details]
Пример cab-файла

Нужен тест к функции FDICopy(), показывающий ошибку определения cab-файла, приложенного в аттаче к баге. 36-байтный cab создать при выполнении теста и проверить его. Точно будут ошибки в определении на наличие файлов и директорий, и в итоге вайн не признает в нём cab-файл, в отличие от windows.
Comment 1 Виталий Перов 2008-03-11 18:16:50 MSK
Если cab-файл пустой:
Выполняется вызов FDICopy(), и где-то внутри (fdi.c:2497) выводится сообщение: "err:cabinet:FDICopy FDIIsCabinet failed."

Если cab-файл не пустой:
Сразу выдаётся ошибка: "wine: Unhandled page fault on execute access to 0x00000000 at address (nil) (thread 0009), starting debugger..."
и запускается дебаггер...
Comment 2 Виталий Перов 2008-03-11 19:11:34 MSK
Created attachment 303 [details]
дописал тест wine/dlls/cabinet/tests/fdi.c

Тест вызывает функцию FDICopy и пытается открыть файл ci-temp0.cab.
Проверяется только возвращаемое значение. В случае FALSE сообщается об ошибке.
Comment 3 Виталий Перов 2008-03-11 19:33:47 MSK
тест неправильный, поторопился
Comment 4 Виталий Перов 2008-03-11 20:04:59 MSK
5-й параметр FDICopy() - PFNFDINOTIFY   pfnfdin
Описание MSDN:
pfnfdin
    A pointer to a file notification function that is called periodically to update the application on the status of the decoder. For more information, see Remarks.

Как я понял, туда надо передавать адрес функции, которая будет показывать статус распаковки.
Я передавал туда NULL.
В итоге, когда cab-файл пустой, эта функция не вызывается, а когда не пустой, то происходит обращение по нулевому адресу.

В wine fdi.c:2511
if (((*pfnfdin)(fdintCABINET_INFO, &fdin))) {
    PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT;
    PFDI_INT(hfdi)->perf->erfType = 0;
    PFDI_INT(hfdi)->perf->fError = TRUE;
    goto bail_and_fail;
  }
функция вызывается в любом случае, даже если pfnfdin=NULL

Надо проверить как в windows.

Думаю в этом месте надо написать проверку, чтобы при pfnfdin==NULL ничего не происходило

Comment 5 Виталий Перов 2008-03-11 20:28:29 MSK
Проверил в windows - функция pfnfdin вызывается в любом случае, даже
если pfnfdin=NULL
Comment 6 Константин Кондратюк 2008-03-11 23:33:20 MSK
Наверное, можно тестовый каб из 36 байт не хранить отдельно, а создавать в ходе выполнения теста, заполнять эти 36 байт, проверять, а потом удалять созданный файл. Получим необходимый нам тест на содержание файлов/директорий, при этом ничего лишнего не таская за собой, кроме одного патча.
Comment 7 Виталий Перов 2008-03-13 18:32:29 MSK
Теперь тестовый cab-файл создаётся в процессе теста.

Патч добавил в:
wine-etersoft-public/patches/check/tests-cabinet-test_FDICopy-empty_cab_file.patch
Comment 8 Виталий Перов 2008-03-17 21:24:25 MSK
Послал патч в winehq - не понравился код.
Переписываю код с использованием WINAPI функций работы с файлами
Comment 9 Виталий Перов 2008-03-17 21:50:08 MSK
Переписал патч. Добавил в CVS
Comment 10 Виталий Перов 2008-03-18 19:59:56 MSK
переписал с использованием assert()