vfs: kernel_flock and named streams
authorRalph Boehme <slow@samba.org>
Wed, 29 Apr 2015 14:53:04 +0000 (16:53 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 29 Apr 2015 21:42:20 +0000 (23:42 +0200)
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 <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/modules/vfs_gpfs.c
source3/smbd/open.c

index c8ba563f14cdc5dc7b293adbb9d634dd04b294ac..6ab17d5026b8ef4d27f47f8430b48e87c44688f5 100644 (file)
@@ -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)) {
index ca674b4b03080d24fede4a6a9ff6b262cde22b68..f7c80a0b2bbecf8c7acc7554b6f1625399e1e76f 100644 (file)
@@ -3065,6 +3065,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 ){