Bug 1098

Summary: 1С 7.7 "Общая файловая ошибка при доступе к" файлу
Product: WINE@Etersoft Reporter: Антон Азанов (Djelf) <aae>
Component: Файловые операцииAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact:
Severity: critical    
Priority: P5 CC: baraka, boris, lav, saa, vostok
Version: 1.0.8   
Target Milestone: ---   
Hardware: PC   
OS: Ubuntu   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 777    
Attachments: исходник тестовой программы, воспроизводящей багу
исходник тестовой программы, воспроизводящей багу
Скрипт, выполняющий 2 теста
исходник тестовой программы, воспроизводящей багу

Description Антон Азанов (Djelf) 2008-01-25 16:10:51 MSK
1C 7.70.027, wine@etersoft.sql 1.0.8n-1.0.9b, ubuntu 7.04

При попытке записать файл *.mxl или *.txt из 1С поверх уже существующего (можно просто открыть файл и нажать кнопку "сохранить") 1С выводит сообщение: "Общая файловая ошибка при доступе к" файлу. При этом файл в каталоге исчезает.

Проблема возникает при работе с файлами в каталоге смонтированном по cifs. 
При перезаписи в локальных каталогах проблемы нет.
Перезапись *.ert файлов в любой каталог также проходит нормально.
1С в файловом режиме нормально работает с этим же каталогом.
Comment 1 Vitaly Lipatov 2008-01-25 17:33:46 MSK
Надо нам создать постоянную тестовую площадку для тестирования linux-cifs.
Comment 2 Анатолий Лютин 2008-02-19 19:04:57 MSK
Подтверждаю.
Comment 3 Анатолий Лютин 2008-02-19 19:30:52 MSK
Насчёт удаления так же подтверждаю. Почему-то вызывается функция CreateFileW с FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE ( удалить файл ).
Comment 4 Анатолий Лютин 2008-02-19 20:21:28 MSK
А если запретить удалять этот файл, то будет ошибка "Доступ к файлу закрыт"
Comment 5 Анатолий Лютин 2008-03-19 18:47:48 MSK
Жду тестовой площадки..
Comment 6 Анатолий Лютин 2008-03-19 19:20:44 MSK
Классно!!

Открываю в Конфигураторе эту БД, смонтированную по cifs, далее создаю текстовый файл, сохраняю его, затем нажимаю ещё раз сохранить, заменяю этот текстовый файл и после диалога подтверждения замены:

В ww и wine:
"Общая файловая ошибка .." и падение с :
handled exception: page fault on write access to 0x5841594c in 32-bit code (0x013c45df).
Register dump:
 CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
 EIP:013c45df ESP:0034f6f4 EBP:0034f94c EFLAGS:00010206(   - 00      - RIP1)
 EAX:0154586c EBX:0034f940 ECX:015457b0 EDX:0011c858
 ESI:0034f918 EDI:0011c748
Stack dump:
0x0034f6f4:  0034f6f8 5f45a5d7 00000001 5f45a653
0x0034f704:  0034f940 2301f6e8 23003789 015449e0
0x0034f714:  5f49c568 00000001 5f49ba70 00000001
0x0034f724:  00000000 00000000 00000000 00000001
0x0034f734:  00000000 00000000 00000000 00000000
0x0034f744:  00000000 7eb428f0 00000000 00000000
Backtrace:
=>1 0x013c45df (0x0034f94c)
  2 0x5f460a64 in mfc42 (+0x60a64) (0x0034f968)

А в wwo:
Всё сохраняется корректно !!!! 
Comment 7 Анатолий Лютин 2008-03-19 19:40:14 MSK
race:file:RtlDosPathNameToNtPathName_U ptr = L"F:\\1SBDemo\\2.txt"
trace:file:wine_nt_to_unix_file_name #0001
trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\2.txt" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/2.txt"
trace:file:MoveFileWithProgressW (L"F:\\1SBDemo\\MFCe287.tmp",L"F:\\1SBDemo\\2.txt",(nil),(nil),0002)
trace:file:RtlDosPathNameToNtPathName_U (L"F:\\1SBDemo\\MFCe287.tmp",0x34eef0,(nil),(nil))
trace:file:RtlDosPathNameToNtPathName_U ptr = L"?4???4???4???????4?4???4???4??"
trace:file:RtlDosPathNameToNtPathName_U dos_path = 0x43
trace:file:RtlGetFullPathName_U (L"F:\\1SBDemo\\MFCe287.tmp" 520 0x34ebc4 (nil))
trace:file:RtlDosPathNameToNtPathName_U ptr = L"F:\\1SBDemo\\MFCe287.tmp"
trace:file:wine_nt_to_unix_file_name #0001
trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\MFCe287.tmp" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/MFCe287.tmp"
trace:file:wine_nt_to_unix_file_name (null)
trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\MFCe287.tmp" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/MFCe287.tmp"
trace:file:RtlDosPathNameToNtPathName_U (L"F:\\1SBDemo\\2.txt",0x34eef0,(nil),(nil))
trace:file:RtlDosPathNameToNtPathName_U ptr = L""
trace:file:RtlDosPathNameToNtPathName_U dos_path = 0x74
trace:file:RtlGetFullPathName_U (L"F:\\1SBDemo\\2.txt" 520 0x34ebc4 (nil))
trace:file:RtlDosPathNameToNtPathName_U ptr = L"F:\\1SBDemo\\2.txt"
trace:file:wine_nt_to_unix_file_name #0001
warn:file:wine_nt_to_unix_file_name L"2.txt" not found in /home/vostok/.wine/dosdevices/f:/1SBDemo
trace:file:wine_nt_to_unix_file_name L"?"
warn:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\2.txt" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/2.txt" required a case-insensitive search
trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\2.txt" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/2.txt"
trace:file:FILE_SetDosError errno = 26 Текстовый файл занят
warn:file:FILE_SetDosError unknown file error: Текстовый файл занят
trace:file:DeleteFileW L"F:\\1SBDemo\\MFCe287.tmp"
trace:file:RtlDosPathNameToNtPathName_U (L"F:\\1SBDemo\\MFCe287.tmp",0x34e83c,(nil),(nil))
Comment 8 Анатолий Лютин 2008-03-19 19:50:12 MSK
Необходимо написать тест на функцию MoveFileWithProgressW для файлов, которые находятся на смонтированном по cifs каталоге ( cellar : /mnt/cifs/ ).

С 1с 7.7 бага упрощено воспроизводится следующим образом:
1. Открыть из конфигуратора любой файл, находящийся на смонтированном по cifs.
2. Сохранить его (можно просто по ctrl+s) - получим сообщение об ошибке доступа, но 1с не упадёт.
3. Если второй раз сразу сохранить, то сохранение пройдёт успешно.
Comment 9 Виталий Перов 2008-03-20 22:08:28 MSK
Created attachment 334 [details]
исходник тестовой программы, воспроизводящей багу

Тест проходит в локальном каталоге, но проваливается в cellar : /mnt/cifs/
Comment 10 Виталий Перов 2008-03-21 17:56:50 MSK
Created attachment 335 [details]
исходник тестовой программы, воспроизводящей багу

Переписал так, чтобы имя файла можно было передавать аргументом
Comment 11 Виталий Перов 2008-03-21 18:12:01 MSK
Created attachment 336 [details]
Скрипт, выполняющий 2 теста

Скрипт для shell. Запускает тест в разных директориях:
1) локальной
2) cellar: /mnt/cifs/tmp
Comment 12 Виталий Перов 2008-03-21 19:35:26 MSK
Created attachment 337 [details]
исходник тестовой программы, воспроизводящей багу

Исправил ошибку в тесте
Comment 13 Виталий Перов 2008-03-21 19:38:16 MSK
Ошибку выдаёт функция rename, находящаяся в MoveFileWithProgressW().
Так что MoveFileWithProgressW работает нормально
Comment 14 Vitaly Lipatov 2008-03-21 19:44:13 MSK
(In reply to comment #13)
> Ошибку выдаёт функция rename, находящаяся в
> MoveFileWithProgressW().
> Так что MoveFileWithProgressW работает нормально
Можно ли упростить тест так, чтобы он напрямую использовал rename и показывал ошибку?

Comment 15 Анатолий Лютин 2008-03-21 19:47:25 MSK
(In reply to comment #14)
> Можно ли упростить тест так, чтобы он
> напрямую использовал rename и показывал
> ошибку?
> 

А это целесообразно для того случая, если мы собираемся этот тест отправлять в WineHQ? Т.к. rename не WinAPI функция, то кросстест для этой функции сделать будет невозможно.
Comment 16 Виталий Перов 2008-03-21 20:04:21 MSK
Сделал похожий тест для функции rename(). В итоге: тест проходит в локальном каталоге, но проваливается в cellar:/mnt/cifs/
Comment 17 Виталий Перов 2008-03-22 11:26:37 MSK
Написал тест к rename() для gcc. Тест проходит!
Comment 18 Виталий Перов 2008-03-22 11:46:45 MSK
Виталик предположил, что файл может не успевать закрываться перед перемещением.

Попробовал поставить задержку (3 с) перед перемещением - ничего не изменилось.
Comment 19 Виталий Перов 2008-03-22 12:28:55 MSK
Нашёл багу. В начале MoveFileWithProgressW() открывает исходный файл, на забывает его закрыть.
Добавление функции закрытия файла решает проблему.

Надо ещё проверить копирование файла между 2-мя файловыми системами
Comment 20 Виталий Перов 2008-03-22 13:07:19 MSK
при копировании с локальной ФС на cifs тест проваливается

rename() не может копировать между разными ФС, но если она проваливается, там стоит код, который копирует в новый файл, затем удаляет старый.

Но этот код не выполняется, там стоит условие:
if (errno == EXDEV && (flag & MOVEFILE_COPY_ALLOWED))
которое не выполняется
Comment 21 Виталий Перов 2008-03-22 13:26:41 MSK
Забыл в тесте вызывать функцию с MOVEFILE_COPY_ALLOWED