| 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.