[samba] Ошибка чтения пустого каталога
Alexander Bokovoy
a.bokovoy на sam-solutions.net
Ср Апр 7 10:07:07 MSD 2004
On Wed, Apr 07, 2004 at 12:55:19PM +1000, Oleg Gints wrote:
> Но проблема остается, всем же пользователям не будешь объяснять -
> вы тут на эту красную надпись внимание не обращайте, это ошибка в win
>
> Кстати, местный проводник, судя по траффику, тоже пытается вызвать
> findnext(".."), только полученную ошибку молча проглатывает и
> пользователя об этом никак не информирует. Ошибку видно только в FAR и
> в DOS-сессии.
Интересно...
> >>Осталось выяснить, исправлена ли эта ситуация в последней версии
> >>самбы.
> >
> >Это и есть последняя версия Самбы.
>
> Патч, исправляющий ошибку чтения пустого каталога для win9X приложен.
> Проверял на samba-3.0.3-alt0.2
>
> Там же исправление touch для корзины. Сделано самым простым путем -
> т.е. вызовом utime с параметром NULL, тогда на установку времени
> не требуется быть владельцем файла или прав администратора.
> Если надо совсем "по-правильному", то можно переделать по аналогии
> с source/smbd/dosmode.c - функция file_utime, только тогда будет
> требоваться переключение become_root()/unbecome_root() и дополнительные
> проверки на каждый удаляемый файл.
> diff -urN samba-3.0.release.orig/source/modules/vfs_recycle.c samba-3.0.release/source/modules/vfs_recycle.c
> --- samba-3.0.release.orig/source/modules/vfs_recycle.c 2004-03-20 02:51:30 +0900
> +++ samba-3.0.release/source/modules/vfs_recycle.c 2004-04-07 08:47:26 +1000
> @@ -300,19 +300,8 @@
> **/
> static void recycle_do_touch(vfs_handle_struct *handle, const char *fname)
> {
> - SMB_STRUCT_STAT st;
> - struct utimbuf tb;
> - time_t currtime;
> -
> - if (SMB_VFS_NEXT_STAT(handle, handle->conn, fname, &st) != 0) {
> - DEBUG(0,("recycle: stat for %s returned %sn", fname, strerror(errno)));
> - return;
> - }
> - currtime = time(&currtime);
> - tb.actime = currtime;
> - tb.modtime = st.st_mtime;
>
> - if (SMB_VFS_NEXT_UTIME(handle, handle->conn, fname, &tb) == -1 ) {
> + if (SMB_VFS_NEXT_UTIME(handle, handle->conn, fname, NULL) == -1 ) {
> DEBUG(0, ("recycle: touching %s failed, reason = %sn", fname, strerror(errno)));
> }
> }
Думаю, что этот вариант пройдет. Втягивать become/unbecome_root() очень не
хочется, да и предназначены они не для этого.
> diff -urN samba-3.0.release.orig/source/smbd/trans2.c samba-3.0.release/source/smbd/trans2.c
> --- samba-3.0.release.orig/source/smbd/trans2.c 2004-03-20 02:51:46 +0900
> +++ samba-3.0.release/source/smbd/trans2.c 2004-04-06 16:37:45 +1000
> @@ -1160,6 +1160,8 @@
> BOOL out_of_space = False;
> int space_remaining;
> NTSTATUS ntstatus = NT_STATUS_OK;
> + pstring tmppath;
> + char *tmppath_ptr = tmppath;
Зачем tmppath_ptr? pstring все равно совместим с char* по типу.
> if (total_params < 12)
> return(ERROR_DOS(ERRDOS,ERRinvalidparam));
> @@ -1168,7 +1170,15 @@
>
> srvstr_get_path(inbuf, resume_name, params+12, sizeof(resume_name), -1, STR_TERMINATE, &ntstatus);
> if (!NT_STATUS_IS_OK(ntstatus)) {
> + if (!NT_STATUS_EQUAL(ntstatus, NT_STATUS_OBJECT_PATH_SYNTAX_BAD)) {
> return ERROR_NT(ntstatus);
> + } else {
> + /* W9X call findnext("..") for empty dir */
> + srvstr_pull( inbuf, tmppath_ptr, params+12, sizeof(tmppath), -1, STR_TERMINATE);
> + if (strcmp(tmppath,"..") != 0) {
> + return ERROR_NT(ntstatus);
> + }
> + }
> }
А Вы проверяли на системах, отличных от Win9X (NT/W2K/XP/W2K3)?
--
/ Alexander Bokovoy
Samba Team http://www.samba.org/
ALT Linux Team http://www.altlinux.org/
Midgard Project Ry http://www.midgard-project.org/
Подробная информация о списке рассылки Samba