[PATCH] Remove file system sharemode before calling unlink

Jeremy Allison jra at samba.org
Thu Jan 11 23:34:47 UTC 2018


On Wed, Jan 10, 2018 at 04:38:29PM -0700, Christof Schmitt via samba-technical wrote:
> From 05c37256483d961a4448239292022ec38d8ff188 Mon Sep 17 00:00:00 2001
> From: Christof Schmitt <cs at samba.org>
> Date: Wed, 10 Jan 2018 15:56:08 -0700
> Subject: [PATCH] Remove file system sharemode before calling unlink
> 
> GPFS implements the DENY_DELETE sharemode, which prevents unlink() from
> deleting the file.. This causes the problem that deleting a file through
> "delete on close" fails, as the code in close.c first calls unlink() and
> only later removes the file system sharemode.
> 
> Fix this by removing the file system sharemode before calling unlink().

Hmmm. This opens up a race that could cause the unlink
to then fail, if a non-smbd process (i.e. one that ignores
the tdb share mode lock) opens the path and sets a sharemode
between the SMB_VFS_KERNEL_FLOCK() and SMB_VFS_UNLINK()
calls, but I guess failing the unlink in that case is
also the right thing to do.

RB+ and I'll push if I can ever get an autobuild working
again :-).

Jeremy.

> Signed-off-by: Christof Schmitt <cs at samba.org>
> ---
>  source3/smbd/close.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/source3/smbd/close.c b/source3/smbd/close.c
> index 095feec..2f6cc4f 100644
> --- a/source3/smbd/close.c
> +++ b/source3/smbd/close.c
> @@ -446,6 +446,22 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
>  		}
>  	}
>  
> +	if (fsp->kernel_share_modes_taken) {
> +		int ret_flock;
> +
> +		/*
> +		 * A file system sharemode could block the unlink;
> +		 * remove filesystem sharemodes first.
> +		 */
> +		ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, 0, 0);
> +		if (ret_flock == -1) {
> +			DBG_INFO("removing kernel flock for %s failed: %s\n",
> +				  fsp_str_dbg(fsp), strerror(errno));
> +		}
> +
> +		fsp->kernel_share_modes_taken = false;
> +	}
> +
>  
>  	if (SMB_VFS_UNLINK(conn, fsp->fsp_name) != 0) {
>  		/*
> -- 
> 1.8.3.1
> 



More information about the samba-technical mailing list