From 7daf165561107684e2890732bce81c6d89639ebc Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 29 Apr 2015 16:53:04 +0200 Subject: [PATCH] vfs: kernel_flock and named streams Streams implementing VFS modules may implement streams in a way that the fsp will have the basefile open in the fsp fd, so lacking a distinct fd for the stream, kernel_flock will apply on the basefile which is wrong. The actual check is deffered to the VFS module implementing the kernel_flock call. Bug: https://bugzilla.samba.org/show_bug.cgi?id=11243 Signed-off-by: Ralph Boehme --- source3/modules/vfs_gpfs.c | 10 ++++++++++ source3/smbd/open.c | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c index aa07060..aa61d35 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -135,6 +135,16 @@ static int vfs_gpfs_kernel_flock(vfs_handle_struct *handle, files_struct *fsp, return 0; } + /* + * A named stream fsp will have the basefile open in the fsp + * fd, so lacking a distinct fd for the stream we have to skip + * kernel_flock and set_gpfs_sharemode for stream. + */ + if (!is_ntfs_default_stream_smb_fname(fsp->fsp_name)) { + DEBUG(2,("%s: kernel_flock on stream\n", fsp_str_dbg(fsp))); + return 0; + } + kernel_flock(fsp->fh->fd, share_mode, access_mask); if (!set_gpfs_sharemode(fsp, access_mask, fsp->share_access)) { diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 773b146..86c1c31 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -3064,6 +3064,15 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, if (fsp->fh->fd != -1 && lp_kernel_share_modes(SNUM(conn))) { int ret_flock; + /* + * Beware: streams implementing VFS modules may + * implement streams in a way that fsp will have the + * basefile open in the fsp fd, so lacking a distinct + * fd for the stream kernel_flock will apply on the + * basefile which is wrong. The actual check is + * deffered to the VFS module implementing the + * kernel_flock call. + */ ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, share_access, access_mask); if(ret_flock == -1 ){ -- 2.1.0