Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2469 - При установке не перезаписываются символические ссылки на файлы   Make a simular bug
Summary: При установке не перезаписываются символические ссылки на файлы
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Файловые операции (show other bugs)
Version: 1.0.9
Hardware: PC All
: P4 minor
Target Milestone: ---
Assignee: Виталий Перов
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 777 1877
  Show dependency treegraph
 
In work:
Reported: 2008-09-18 18:21 MSD by Vitaly Lipatov
Modified: 2019-06-20 13:48 MSK (History)
1 user (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Lipatov 2008-09-18 18:21:40 MSD
При установке WSH (см. файл WindowsXP-Windows2000-Script56-KB917344-x86-enu.exe в windows/downloads) если файлы уже присутствуют в system32 (например vbscript.dll) в виде ярлыков (возможно, битых ярлыков), они не перезаписываются с такой ошибкой при установке:
err:setupapi:SetupDefaultQueueCallbackW copy error 5 L"C:\\windows\\temp\\IXP001.TMP\\vbscript.dll" -> L"C:\\windows\\system32\\vbscript.dll"

Возможно ли это устранить?
Comment 1 Виталий Перов 2008-09-19 12:18:08 MSD
Проблема знакомая:
файл скорее всего read-only, поэтому wine не может его перезаписать.
ещё со стороны wine не отличить обычный файл от ссылки.
Пробовал снять атрибут read-only перед перезаписью, но не получилось. Возможно проблема с правами доступа. Надо подробней в этом разобраться
Comment 2 Виталий Перов 2008-09-19 12:28:41 MSD
Проверил. Владелец ссылок root. При обращении к файлу wine просто переходит по ссылке. Поэтому права есть только для чтение! Как я уже говорил, внутри wine невозможно определить ссылка это или файл, поэтому и ссылкой внутри wine невозможно ничего сделать.

Думаю, единственный выход здесь - убрать все ссылки
Comment 3 Виталий Перов 2008-09-19 12:46:19 MSD
ещё надо проверить возможность удалять ссылку перед записью.
Возможно это будет работать
Comment 4 Виталий Перов 2008-09-19 14:02:39 MSD
Протестировал работу с ссылками:
- При выполнении CreateFileA с атрибутом CREATE_ALWAYS файл перезаписывается, что логично
- При удалении файла удаляется ссылка, а не файл, что тоже логично
- Но! если удалять read-only файл, то удаление проваливается! (код 5 = ACCESS DENIED 
Comment 5 Виталий Перов 2008-09-19 16:11:59 MSD
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

Comment 6 Виталий Перов 2008-09-19 17:19:02 MSD
если убрать атрибуты GENERIC_READ | GENERIC_WRITE, и FILE_SHARE_READ | FILE_SHARE_WRITE, то файл без проблем удаляется.
Проблема только в том, что в данном случае будут удаляться и read-only файлы, а этого быть не должно.

можно попробовать использовать юниксовую функцию fstat для определения является ли файл ссылкой. Если является, то удалять его даже если он read-only
Comment 7 Виталий Перов 2008-09-19 19:47:21 MSD
возникли проблемы с макросом S_ISLNK, который определяет является ли файл ссылкой.
Написал тест под линукс. Там этот макрос работает прекрасно.
Comment 8 Виталий Перов 2008-09-19 20:46:37 MSD
не знаю почему, но выражение (st.st_mode & S_IFLNK) всегда равно 32768 независимо от того файл это или ссылка. Кроме того st.st_mode тоже всегда равно 33060. Очень это странно
Comment 9 Виталий Перов 2008-09-19 21:12:44 MSD
нашёл свою ошибку:
если в пути используются символические, то необходимо применять lstat вместо stat

Теперь символические ссылки удаляются независимо от прав на запись исходного файла.
Comment 10 Виталий Перов 2008-09-19 21:20:52 MSD
Проверил исходное приложение: всё прекрасно устанавливается.
Comment 11 Vitaly Lipatov 2019-06-20 13:48:57 MSK
Решение добавляет функцию
+/******************************************************************
+ *  NTDLL_IsFileALink
+ *  check wheather file is a Unix link
+ *  Fix eterbug #2469
+ */
+BOOL NTDLL_IsFileALink( POBJECT_ATTRIBUTES attr )