Bug 1026

Summary: Не работает FindFirstFile() на разделе, смонтированном по NFS
Product: WINE@Etersoft Reporter: Константин Кондратюк <kondratyuk>
Component: ОбщееAssignee: Vitaly Lipatov <lav>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P5 CC: lav
Version: 1.0.8   
Target Milestone: ---   
Hardware: PC   
OS: FreeBSD   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 547, 584, 812, 815    
Deadline: 2007-12-26   
Attachments: Тест на FindFirstFile()
Скомпилированный тест

Description Константин Кондратюк 2007-12-26 09:12:47 MSK
Проблема проявляется на нашей BSD-машине.
Из-за неё, например, не работает Консультант со смонтированного ftp.
Comment 1 Vitaly Lipatov 2007-12-26 10:09:15 MSK
1. Надо выложить более нижнюю функцию, которая не работает.
2. Надо запустить winelocktest на каталоге NFS, доступном на запись.
Comment 2 Константин Кондратюк 2007-12-26 10:17:37 MSK
Start test as STANDALONE for lockfile.wine file...
No check VFS filesystem
             G_R   G_R   G_R   G_W   G_W   G_W G_R|W G_R|W G_R|W
             S_R   S_W S_R|W   S_R   S_W S_R|W   S_R   S_W S_R|W

       G_R   uVL   u.    uVL   u.    u.    u.    u.    u.    u.
       S_R

       G_R   u.    u.    u.    uVL   u.    uVL   u.    u.    u.
       S_W

       G_R   uVL   u.    uVL   uVL   u.    uVL   uVL   u.    uVL
     S_R|W

       G_W   u.    uVL   uVL   u.    u.    u.    u.    u.    u.
       S_R

       G_W   u.    u.    u.    u.    uVL   uVL   u.    u.    u.
       S_W

       G_W   u.    uVL   uVL   u.    uVL   uVL   u.    uVL   uVL
     S_R|W

     G_R|W   u.    u.    uVL   u.    u.    u.    u.    u.    u.
       S_R

     G_R|W   u.    u.    u.    u.    u.    uVL   u.    u.    u.
       S_W

     G_R|W   u.    u.    uVL   u.    u.    uVL   u.    u.    uVL
     S_R|W
Comment 3 Константин Кондратюк 2007-12-26 10:21:35 MSK
В той же директории (запись разрешена) запуск теста проваливается:
trace:file:FindFirstFileExW L"F:\\DISTR\\DIN\\ARB00001.DIN" 0 0x67faf0 0 0x0 0
trace:file:RtlDosPathNameToNtPathName_U (L"F:\\DISTR\\DIN\\ARB00001.DIN",0x67fa70,0x67fa7c,0x0)
trace:file:RtlGetFullPathName_U (L"F:\\DISTR\\DIN\\ARB00001.DIN" 520 0x67f7f0 0x67fa7c)
trace:ntdll:NtCreateFile handle=0x1208e4 access=80000000 name=L"\\??\\F:\\DISTR\\DIN\\" objattr=00000040 root=0x0 sec=0x0 io=0x67fa68 alloc_size=0x0
attr=00000000 sharing=00000003 disp=1 options=00000021 ea=0x0.0x00000000
trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\DISTR\\DIN\\" -> "/home/builder/.wine/dosdevices/f:/DISTR/DIN/"
trace:file:WriteFile 0x8 0x67f900 7 0x67fd08 0x0
trace:ntdll:NtWriteFile (0x8,0x0,0x0,0x0,0x67f8c0,0x67f900,0x00000007,0x0,0x0)!
Error
Comment 4 Vitaly Lipatov 2007-12-26 10:54:52 MSK
тест надо положить в репозиторий wine-etersoft-devel
Comment 5 Константин Кондратюк 2007-12-26 13:31:25 MSK
SERVER_START_REQ( create_file )
{
    req->access     = access;
    req->attributes = attr->Attributes;
    req->sharing    = sharing;
    req->create     = disposition;
    req->options    = options;
    req->attrs      = attributes;
    wine_server_add_data( req, &objattr, sizeof(objattr) );
    if (objattr.sd_len) wine_server_add_data( req, sd, objattr.sd_len );
    wine_server_add_data( req, unix_name.Buffer, unix_name.Length );
    io->u.Status = wine_server_call( req );
    *handle = reply->handle;
}
SERVER_END_REQ;

При вызове из FindFirstFile() возвращается неправильный io->u.Status
Comment 6 Vitaly Lipatov 2007-12-26 17:15:57 MSK
Вот от вызова FindFirstFile до ошибки лог (+file,+server):
trace:file:FindFirstFileExW L"test.txt" 0 0x67fad0 0 0x0 0
trace:file:RtlDosPathNameToNtPathName_U (L"test.txt",0x67fa50,0x67fa5c,0x0)
trace:file:RtlGetFullPathName_U (L"test.txt" 520 0x67f7d0 0x67fa5c)
trace:file:wine_nt_to_unix_file_name L"\\??\\N:\\kondratyuk\\" -> "/home/lav/.wine/dosdevices/n:/kondratyuk/"
000b: create_file( access=80000000, attributes=00000040, sharing=00000003, create=1, options=00000021, attrs=00000000, objattr={rootdir=0x0,sd={},name=L""}, filename="/home/lav/.wine/dosdevices/n:/kondratyuk/" )
000b: create_file() = SHARING_VIOLATION { handle=0x0 }
trace:file:WriteFile 0x8 0x67f8e0 19 0x67fce8 0x0
Error: not finded
Comment 7 Константин Кондратюк 2007-12-27 08:15:24 MSK
Created attachment 233 [details]
Тест на FindFirstFile()

При запуске этого теста на NFS-разделе в BSD, получаем ошибку.
Comment 8 Константин Кондратюк 2007-12-27 08:16:14 MSK
Created attachment 234 [details]
Скомпилированный тест
Comment 9 Константин Кондратюк 2007-12-27 08:17:40 MSK
Проявляется только в закрытой части. В свободной всё нормально работает.
Comment 10 Vitaly Lipatov 2007-12-29 22:28:37 MSK
Исправлено в новой сборке
* Sat Dec 29 2007 Vitaly Lipatov <lav@altlinux.ru> 1.0.8-alt6
- now fail program if use CIFS without our linux-cifs
- fix file locking on FreeBSD (fix eterbug #1026)

нам передавался дескриптор на каталог, а мы пытались установить на него блокировку, что не получалось.