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 |
Если 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..." и запускается дебаггер... Created attachment 303 [details]
дописал тест wine/dlls/cabinet/tests/fdi.c
Тест вызывает функцию FDICopy и пытается открыть файл ci-temp0.cab.
Проверяется только возвращаемое значение. В случае FALSE сообщается об ошибке.
тест неправильный, поторопился 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 ничего не происходило Проверил в windows - функция pfnfdin вызывается в любом случае, даже если pfnfdin=NULL Наверное, можно тестовый каб из 36 байт не хранить отдельно, а создавать в ходе выполнения теста, заполнять эти 36 байт, проверять, а потом удалять созданный файл. Получим необходимый нам тест на содержание файлов/директорий, при этом ничего лишнего не таская за собой, кроме одного патча. Теперь тестовый cab-файл создаётся в процессе теста. Патч добавил в: wine-etersoft-public/patches/check/tests-cabinet-test_FDICopy-empty_cab_file.patch Послал патч в winehq - не понравился код. Переписываю код с использованием WINAPI функций работы с файлами Переписал патч. Добавил в CVS переписал с использованием assert() |
Created attachment 295 [details] Пример cab-файла Нужен тест к функции FDICopy(), показывающий ошибку определения cab-файла, приложенного в аттаче к баге. 36-байтный cab создать при выполнении теста и проверить его. Точно будут ошибки в определении на наличие файлов и директорий, и в итоге вайн не признает в нём cab-файл, в отличие от windows.