From c7f686bfc3b4550b0d5b01067c68dabb97e59ccc 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 Reviewed-by: Jeremy Allison (cherry picked from commit d748652e5b1c1c0238a2b86cdf14d7f6de7ce9b2) --- 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 f9eb7e8..2efac19 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -66,6 +66,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; + } + START_PROFILE(syscall_kernel_flock); kernel_flock(fsp->fh->fd, share_mode, access_mask); diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 4fcdff8..f50db2f 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -2737,6 +2737,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