[samba] Ошибка чтения пустого каталога

Oleg Gints oleg на cec.amur.elektra.ru
Чт Апр 1 07:14:29 MSD 2004


Alexander Bokovoy пишет:

>>Samba-3.0.2a-alt8.M22
>>Клиент WIN ME, при чтении ПУСТОГО каталога получаем ошибку:
>>
>>L:\>cd 1234 
>>  L:\1234>dir
>>
>> Том в устройстве L имеет метку DISK K
>> Содержимое папки L:\1234
>>
>>.              <ПАПКА>      31.03.04  13:43 . 
>>..             <ПАПКА>      31.03.04  14:06 ..Ошибка 161 
>>
>>L:\1234>
>>
>>FAR на этом месте выдает "Указанное имя неверно. Не удается прочесть
>>содержимое папки"
>>
>>Просматривая пакеты с помощью ethereal видно,
>>что 161 ошибку самба выдает после получения
>>запроса:
>>Trans2 Request, FIND_NEXT2, Continue: ..
>>
>>По логам:
>>[2004/03/31 14:28:03, 10] lib/util.c:dump_data(1864)
>>  [000] 00 00 01 04 00 04 01 00  00 00 00 00 00 2E 00 2E  ........ ........
>>  [010] 00 00 00                                          ...
>>[2004/03/31 14:28:03, 3] smbd/process.c:switch_message(685)
>>  switch message SMBtrans2 (pid 9067)
>>[2004/03/31 14:28:03, 4] smbd/uid.c:change_to_user(186)
>>  change_to_user: Skipping user change - already user
>>[2004/03/31 14:28:03, 3] smbd/error.c:error_packet(134)
>>  error packet at smbd/trans2.c(1171) cmd=50 (SMBtrans2) eclass=1 ecode=161
>>
>>Под XP такой ошибки нет, но там запросы другие.
>>
>>Интересно, эта ошибка еще у кого-нибудь наблюдается?
> 
> Не видел. Интересно, не связано ли это с тем же источником, который
> создает проблему и при использовании smbfs в 2.4? Там тоже ошибка в
> обработке TRANS2, правда в коде smbfs.

Разобрался в чем дело, только как корректно исправить ситуацию - не знаю.
Дело связано с изменениями в trans2.c:

функция call_trans2findnext

         if (total_params < 12)
                 return(ERROR_DOS(ERRDOS,ERRinvalidparam));

         *mask = *directory = *resume_name = 0;

-       srvstr_pull(inbuf, resume_name, params+12, sizeof(resume_name), 
-1, STR_TERMINATE);
+       srvstr_get_path(inbuf, resume_name, params+12, 
sizeof(resume_name), -1, STR_TERMINATE, &ntstatus);
+       if (!NT_STATUS_IS_OK(ntstatus)) {
+               return ERROR_NT(ntstatus);
+       }

         DEBUG(3,("call_trans2findnext: dirhandle = %d, max_data_bytes = 
%d, maxentries = %d, \

Ощибка происходит при вызове srvstr_get_path (файл reply.c)
в которой далее вызывается функция check_path_syntax(dest, tmppath)
В качестве параметра передается строка 0x2E 0x2E \0, т.е. то,
что было запрошено со сторны клиента Win ME - FIND_NEXT2("..")

if ((s[0] == '.') && (s[1] == '.') && (IS_DIRECTORY_SEP(s[2]) || s[2] == 
'\0'))
успешно эту стороку отлавливает, и далее срабатывает это условие
if (d == destname) { 

     return NT_STATUS_OBJECT_PATH_SYNTAX_BAD; 

}
и клиент получает ошибку 161 - неверное имя каталога.

Осталось выяснить, исправлена ли эта ситуация в последней версии
самбы.


-- 
С уважением,
Олег Гинц



Подробная информация о списке рассылки Samba