| Summary: | При установке не перезаписываются символические ссылки на файлы | ||
|---|---|---|---|
| Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
| Component: | Файловые операции | Assignee: | Виталий Перов <vitperov> |
| Status: | CLOSED FIXED | QA Contact: | |
| Severity: | minor | ||
| Priority: | P4 | CC: | kondratyuk |
| Version: | 1.0.9 | ||
| Target Milestone: | --- | ||
| Hardware: | PC | ||
| OS: | All | ||
| Whiteboard: | |||
| Заявки RT: | Связано с: | ||
| Дата напоминания: | |||
| Bug Depends on: | |||
| Bug Blocks: | 777, 1877 | ||
|
Description
Vitaly Lipatov
2008-09-18 18:21:40 MSD
Проблема знакомая: файл скорее всего read-only, поэтому wine не может его перезаписать. ещё со стороны wine не отличить обычный файл от ссылки. Пробовал снять атрибут read-only перед перезаписью, но не получилось. Возможно проблема с правами доступа. Надо подробней в этом разобраться Проверил. Владелец ссылок root. При обращении к файлу wine просто переходит по ссылке. Поэтому права есть только для чтение! Как я уже говорил, внутри wine невозможно определить ссылка это или файл, поэтому и ссылкой внутри wine невозможно ничего сделать. Думаю, единственный выход здесь - убрать все ссылки ещё надо проверить возможность удалять ссылку перед записью. Возможно это будет работать Протестировал работу с ссылками: - При выполнении CreateFileA с атрибутом CREATE_ALWAYS файл перезаписывается, что логично - При удалении файла удаляется ссылка, а не файл, что тоже логично - Но! если удалять read-only файл, то удаление проваливается! (код 5 = ACCESS DENIED DeleteFileW вызывает NtDeleteFile, а там содержится всего 2 строки:
status = NtCreateFile( &hFile, GENERIC_READ | GENERIC_WRITE | DELETE,
ObjectAttributes, &io, NULL, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_OPEN, FILE_DELETE_ON_CLOSE, NULL, 0 );
if (status == STATUS_SUCCESS) status = NtClose(hFile);
Т.е при закрытии файла он должен удалиться.
Но файл даже не открывается. Возвращаемый status = 0xc0000022
если убрать атрибуты GENERIC_READ | GENERIC_WRITE, и FILE_SHARE_READ | FILE_SHARE_WRITE, то файл без проблем удаляется. Проблема только в том, что в данном случае будут удаляться и read-only файлы, а этого быть не должно. можно попробовать использовать юниксовую функцию fstat для определения является ли файл ссылкой. Если является, то удалять его даже если он read-only возникли проблемы с макросом S_ISLNK, который определяет является ли файл ссылкой. Написал тест под линукс. Там этот макрос работает прекрасно. не знаю почему, но выражение (st.st_mode & S_IFLNK) всегда равно 32768 независимо от того файл это или ссылка. Кроме того st.st_mode тоже всегда равно 33060. Очень это странно нашёл свою ошибку: если в пути используются символические, то необходимо применять lstat вместо stat Теперь символические ссылки удаляются независимо от прав на запись исходного файла. Проверил исходное приложение: всё прекрасно устанавливается. Решение добавляет функцию +/****************************************************************** + * NTDLL_IsFileALink + * check wheather file is a Unix link + * Fix eterbug #2469 + */ +BOOL NTDLL_IsFileALink( POBJECT_ATTRIBUTES attr ) |