Created attachment 295 [details] Пример cab-файла Нужен тест к функции FDICopy(), показывающий ошибку определения cab-файла, приложенного в аттаче к баге. 36-байтный cab создать при выполнении теста и проверить его. Точно будут ошибки в определении на наличие файлов и директорий, и в итоге вайн не признает в нём cab-файл, в отличие от windows.
Если 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()