The branch, v4-2-test has been updated
       via  bd7bc99 s3: nmbd: Don't set work_changed = True inside 
update_server_ttl().
       via  c79abc9 s3: nmbd: Ensure we only set work_changed = true if we 
modify the record.
       via  82f7a0c vfs: kernel_flock and named streams
       via  509f2bb s4: torture: Test for incorrect file size returned in the 
response of "FILE_SUPERSEDE Create".
       via  251accf s3: smbd: Incorrect file size returned in the response of 
"FILE_SUPERSEDE Create"
      from  794cc5d s4: rpc: Refactor dcesrv_alter() function into setup and 
send steps.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-2-test


- Log -----------------------------------------------------------------
commit bd7bc99353b4d7842816dd5572accb7e9c2adb4c
Author: Jeremy Allison <[email protected]>
Date:   Fri May 1 09:56:59 2015 -0700

    s3: nmbd: Don't set work_changed = True inside update_server_ttl().
    
    This is taken care of inside expire_servers() when it calls
    remove_server_from_workgroup().
    
    Ensure the only functions in nmbd_serverlistdb.c that
    set subnet->work_changed are:
    
    remove_all_servers()
    add_server_to_workgroup()
    remove_server_from_workgroup()
    
    Fix inspired by a change from Volker.
    
    https://bugzilla.samba.org/show_bug.cgi?id=11254
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    (cherry picked from commit c3c820a661c092de31d56c16c8cd1ec57999d2f7)
    
    Autobuild-User(v4-2-test): Karolin Seeger <[email protected]>
    Autobuild-Date(v4-2-test): Tue May  5 23:16:30 CEST 2015 on sn-devel-104

commit c79abc91e1150c0b155745364b234aa68de2d62e
Author: Jeremy Allison <[email protected]>
Date:   Thu Apr 30 12:05:17 2015 -0700

    s3: nmbd: Ensure we only set work_changed = true if we modify the record.
    
    https://bugzilla.samba.org/show_bug.cgi?id=11254
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    (cherry picked from commit db6572ef80e20b0e577b9e9fb5d233f8bdd20713)

commit 82f7a0ce3e690cf0e41708d6cf228e08d928071d
Author: Ralph Boehme <[email protected]>
Date:   Wed Apr 29 16:53:04 2015 +0200

    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 <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    (cherry picked from commit d748652e5b1c1c0238a2b86cdf14d7f6de7ce9b2)

commit 509f2bb970165ff321c746362fb0176b24f778f8
Author: Jeremy Allison <[email protected]>
Date:   Tue Apr 28 16:33:30 2015 -0700

    s4: torture: Test for incorrect file size returned in the response of 
"FILE_SUPERSEDE Create".
    
    https://bugzilla.samba.org/show_bug.cgi?id=11240
    
    Signed-off-by: Kenny Dinh <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Böhme <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Thu Apr 30 22:12:22 CEST 2015 on sn-devel-104
    
    (cherry picked from commit 9d7ecb9fc3a1dcce0d71bc0c4f02f9c7dd9408ab)

commit 251accff51e650cfeb255acc83889676abc80ff6
Author: Jeremy Allison <[email protected]>
Date:   Tue Apr 28 14:22:42 2015 -0700

    s3: smbd: Incorrect file size returned in the response of "FILE_SUPERSEDE 
Create"
    
    https://bugzilla.samba.org/show_bug.cgi?id=11240
    
    Signed-off-by: Kenny Dinh <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Böhme <[email protected]>
    (cherry picked from commit d68383e9638254d1b6805b3d3ea3e5e897908374)

-----------------------------------------------------------------------

Summary of changes:
 selftest/knownfail                 |   1 +
 source3/modules/vfs_default.c      |   8 ++-
 source3/modules/vfs_gpfs.c         |  10 ++++
 source3/nmbd/nmbd_incomingdgrams.c |  22 ++++++--
 source3/nmbd/nmbd_serverlistdb.c   |   5 --
 source3/smbd/open.c                |   9 ++++
 source4/torture/raw/open.c         | 102 +++++++++++++++++++++++++++++++++++++
 7 files changed, 145 insertions(+), 12 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/knownfail b/selftest/knownfail
index af7e7fd..2c35a58 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -128,6 +128,7 @@
 # some operations don't work over the CIFS NTVFS backend yet (eg. root_fid)
 ^samba4.ntvfs.cifs.*.base.createx_sharemodes_dir
 ^samba4.raw.lock.*.async # bug 6960
+^samba4.raw.open.ntcreatex_supersede
 ^samba4.smb2.lock.*.multiple-unlock # bug 6959
 ^samba4.raw.sfileinfo.*.end-of-file\(.*\)$ # bug 6962
 ^samba4.raw.oplock.*.batch22 # bug 6963
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 46589bf..b13ad14 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1904,8 +1904,6 @@ static int vfswrap_ftruncate(vfs_handle_struct *handle, 
files_struct *fsp, off_t
           ftruncate extend but ext2 can. */
 
        result = ftruncate(fsp->fh->fd, len);
-       if (result == 0)
-               goto done;
 
        /* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
           extend a file with ftruncate. Provide alternate implementation
@@ -1919,6 +1917,12 @@ static int vfswrap_ftruncate(vfs_handle_struct *handle, 
files_struct *fsp, off_t
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
+
+       /* We need to update the files_struct after successful ftruncate */
+       if (result == 0) {
+               goto done;
+       }
+
        pst = &fsp->fsp_name->st;
 
 #ifdef S_ISFIFO
diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index 6ead65b..e1e29fa 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -88,6 +88,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/nmbd/nmbd_incomingdgrams.c 
b/source3/nmbd/nmbd_incomingdgrams.c
index 153a86d..2dc684e 100644
--- a/source3/nmbd/nmbd_incomingdgrams.c
+++ b/source3/nmbd/nmbd_incomingdgrams.c
@@ -336,12 +336,25 @@ a local master browser for workgroup %s and we think we 
are master. Forcing elec
                                ttl, comment);
                } else {
                        /* Update the record. */
-                       servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
+                       if (servrec->serv.type !=
+                                       (servertype|SV_TYPE_LOCAL_LIST_ONLY)) {
+                               servrec->serv.type =
+                                       servertype|SV_TYPE_LOCAL_LIST_ONLY;
+                               subrec->work_changed = true;
+                       }
+                       if (!strequal(servrec->serv.comment,comment)) {
+                               strlcpy(servrec->serv.comment,
+                                       comment,
+                                       sizeof(servrec->serv.comment));
+                               subrec->work_changed = true;
+                       }
                        update_server_ttl(servrec, ttl);
-                       
strlcpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment));
                }
-       
-               set_workgroup_local_master_browser_name( work, server_name );
+
+               if (!strequal(work->local_master_browser_name, server_name)) {
+                       set_workgroup_local_master_browser_name( work, 
server_name );
+                       subrec->work_changed = true;
+               }
        } else {
                /*
                 * This server is announcing it is going down. Remove it from 
the
@@ -353,7 +366,6 @@ a local master browser for workgroup %s and we think we are 
master. Forcing elec
                }
        }
 
-       subrec->work_changed = True;
 done:
 
        END_PROFILE(local_master_announce);
diff --git a/source3/nmbd/nmbd_serverlistdb.c b/source3/nmbd/nmbd_serverlistdb.c
index f697f05..70a71ae 100644
--- a/source3/nmbd/nmbd_serverlistdb.c
+++ b/source3/nmbd/nmbd_serverlistdb.c
@@ -133,8 +133,6 @@ workgroup %s. This is a bug.\n", name, work->work_group));
        DEBUG(3,("create_server_on_workgroup: Created server entry %s of type 
%x (%s) on \
 workgroup %s.\n", name,servertype,comment, work->work_group));
  
-       work->subnet->work_changed = True;
- 
        return(servrec);
 }
 
@@ -151,8 +149,6 @@ void update_server_ttl(struct server_record *servrec, int 
ttl)
                servrec->death_time = PERMANENT_TTL;
        else
                servrec->death_time = (ttl != PERMANENT_TTL) ? 
time(NULL)+(ttl*3) : PERMANENT_TTL;
-
-       servrec->subnet->work_changed = True;
 }
 
 /*******************************************************************
@@ -172,7 +168,6 @@ void expire_servers(struct work_record *work, time_t t)
                if ((servrec->death_time != PERMANENT_TTL) && ((t == -1) || 
(servrec->death_time < t))) {
                        DEBUG(3,("expire_old_servers: Removing timed out server 
%s\n",servrec->serv.name));
                        remove_server_from_workgroup(work, servrec);
-                       work->subnet->work_changed = True;
                }
        }
 }
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 ){
 
diff --git a/source4/torture/raw/open.c b/source4/torture/raw/open.c
index 679a7c2..60b73f6 100644
--- a/source4/torture/raw/open.c
+++ b/source4/torture/raw/open.c
@@ -2118,6 +2118,107 @@ done:
        return ret;
 }
 
+/**
+ * Test for file size to be 0 after create with FILE_SUPERSEDE
+ */
+static bool test_ntcreatex_supersede(struct torture_context *tctx, struct 
smbcli_state *cli)
+{
+       union smb_open io;
+       union smb_setfileinfo sfi;
+       union smb_fileinfo finfo;
+       const char *fname = BASEDIR "\\torture_ntcreatex_supersede.txt";
+       NTSTATUS status;
+       int fnum = -1;
+       bool ret = true;
+
+       torture_assert(tctx, torture_setup_dir(cli, BASEDIR), "Failed to setup 
up test directory: " BASEDIR);
+
+       /* reasonable default parameters */
+       io.generic.level = RAW_OPEN_NTCREATEX;
+       io.ntcreatex.in.flags = 0;
+       io.ntcreatex.in.root_fid.fnum = 0;
+       io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
+       io.ntcreatex.in.alloc_size = 0;
+       io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
+       io.ntcreatex.in.create_options = 0;
+       io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+       io.ntcreatex.in.security_flags = 0;
+       io.ntcreatex.in.fname = fname;
+
+       status = smb_raw_open(cli->tree, tctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       fnum = io.ntcreatex.out.file.fnum;
+
+       CHECK_VAL(io.ntcreatex.out.oplock_level, 0);
+       CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED);
+       CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);
+       CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);
+       CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);
+       CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);
+       CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);
+       CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);
+       CHECK_ALL_INFO(io.ntcreatex.out.size, size);
+       CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);
+       CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);
+
+       /* extend the file size */
+       ZERO_STRUCT(sfi);
+       sfi.generic.level = RAW_SFILEINFO_END_OF_FILE_INFO;
+       sfi.generic.in.file.fnum = fnum;
+       sfi.end_of_file_info.in.size = 512;
+       status = smb_raw_setfileinfo(cli->tree, &sfi);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       /* close the file and re-open with to verify new size */
+       smbcli_close(cli->tree, fnum);
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
+       io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_READ;
+       status = smb_raw_open(cli->tree, tctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       fnum = io.ntcreatex.out.file.fnum;
+
+       CHECK_VAL(io.ntcreatex.out.oplock_level, 0);
+       CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_EXISTED);
+       CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);
+       CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);
+       CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);
+       CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);
+       CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);
+       CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);
+       CHECK_VAL(io.ntcreatex.out.size, 512);
+       CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);
+       CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);
+
+       /* close and re-open the file with SUPERSEDE flag */
+       smbcli_close(cli->tree, fnum);
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_SUPERSEDE;
+       io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_READ;
+       io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
+       io.ntcreatex.in.create_options = 0;
+
+       status = smb_raw_open(cli->tree, tctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       fnum = io.ntcreatex.out.file.fnum;
+
+       /* The file size in the superseded create response should be 0 */
+       CHECK_VAL(io.ntcreatex.out.size, 0);
+       CHECK_VAL(io.ntcreatex.out.oplock_level, 0);
+       CHECK_VAL(io.ntcreatex.out.create_action, FILE_WAS_SUPERSEDED);
+       CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);
+       CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);
+       CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);
+       CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);
+       CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);
+       CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);
+done:
+       smbcli_close(cli->tree, fnum);
+       smbcli_deltree(cli->tree, BASEDIR);
+
+       return ret;
+}
 
 /* basic testing of all RAW_OPEN_* calls
 */
@@ -2143,6 +2244,7 @@ struct torture_suite *torture_raw_open(TALLOC_CTX 
*mem_ctx)
        torture_suite_add_1smb_test(suite, "opendisp-dir", 
test_ntcreatex_opendisp_dir);
        torture_suite_add_1smb_test(suite, "ntcreatedir", test_ntcreatexdir);
        torture_suite_add_1smb_test(suite, "open-for-truncate", 
test_open_for_truncate);
+       torture_suite_add_1smb_test(suite, "ntcreatex_supersede", 
test_ntcreatex_supersede);
 
        return suite;
 }


-- 
Samba Shared Repository

Reply via email to