[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