The branch, v4-11-test has been updated
       via  f7ff511bc26 testprogs: Add 'net ads join createupn' test also 
verifying the keytab
       via  d9709735d5b s3:libads: Fix ads_get_upn()
       via  fa3250fdac1 smbd: let delayed update handler also update on-disk 
timestamps
       via  c8b5d996ec7 smbd: let mark_file_modified() always call 
trigger_write_time_update()
       via  8dbdba4a315 smbd: remove stat call from mark_file_modified()
       via  dbff6af0acf smbd: avoid double chdir() in chdir_current_service()
       via  0a8d442fe53 smbd: flush pending writetime update when setting 
timestamps file
       via  4f5a5e5d6e7 smbd: flush pending writetime update when flushing file
       via  5f4a49bd9f6 smbd: always flush pending write time update when 
setting filesize
      from  16d837cb233 nsswitch: fix use-after-free causing segfault in 
_pam_delete_cred

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


- Log -----------------------------------------------------------------
commit f7ff511bc26abf6f7a1b98cf31e461234a387892
Author: Andreas Schneider <[email protected]>
Date:   Fri Apr 3 15:40:48 2020 +0200

    testprogs: Add 'net ads join createupn' test also verifying the keytab
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14336
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Alexander Bokovoy <[email protected]>
    
    Autobuild-User(master): Andreas Schneider <[email protected]>
    Autobuild-Date(master): Mon Apr  6 19:09:53 UTC 2020 on sn-devel-184
    
    (cherry picked from commit c4be195da2845be4f64e47883e3c911dedd90e48)
    
    Autobuild-User(v4-11-test): Karolin Seeger <[email protected]>
    Autobuild-Date(v4-11-test): Tue Apr  7 10:51:07 UTC 2020 on sn-devel-184

commit d9709735d5b26320a141ff686b9919539a8fa8a5
Author: Andreas Schneider <[email protected]>
Date:   Fri Apr 3 15:58:28 2020 +0200

    s3:libads: Fix ads_get_upn()
    
    This adds the userPrincipalName to ads_find_machine_acct() which
    fetches the data for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14336
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Alexander Bokovoy <[email protected]>
    (cherry picked from commit ec69752cb963ae850568d3f4905d2941e485627e)

commit fa3250fdac1c8c79ffec6a4ebaf6183649b9086d
Author: Ralph Boehme <[email protected]>
Date:   Sun Mar 15 08:30:21 2020 +0100

    smbd: let delayed update handler also update on-disk timestamps
    
    Let delayed update handler also update on-disk timestamps by calling
    trigger_write_time_update_immediate().
    
    trigger_write_time_update_immediate() sets fsp->update_write_time_on_close 
to
    false which prevents updating the write-time on close if there was ever 
only one
    write to the file.
    
    Besides resetting fsp->update_write_time_on_close and setting the on-disk 
timestamps
    trigger_write_time_update_immediate() takes the same steps as the removed 
code.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14320
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Thu Mar 19 03:05:40 UTC 2020 on sn-devel-184
    
    (back ported from commit 81c1a14e3271aeed7ed4fe6311171b19ba963555)

commit c8b5d996ec77704835c59f4b2cd8190c31df98c2
Author: Ralph Boehme <[email protected]>
Date:   Sun Mar 15 08:30:21 2020 +0100

    smbd: let mark_file_modified() always call trigger_write_time_update()
    
    Preperatory change: the next commit will reset 
fsp->update_write_time_on_close
    in the event handler, so this change ensures it gets set again for any
    subsequent write.
    
    This will NOT always result in a write-time update because
    trigger_write_time_update() has its own only-once logic using the internal
    variable fsp->update_write_time_triggered.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14320
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    (cherry picked from commit 53de2da7acfc24513082190502d93306c12b7434)

commit 8dbdba4a3156e1b0caf18a55591cacebedb12369
Author: Ralph Boehme <[email protected]>
Date:   Sun Mar 15 15:51:18 2020 +0100

    smbd: remove stat call from mark_file_modified()
    
    This stat dates back to d03453864ab1bc5fd3b4a3abaf96176a006c102b where the 
call
    to trigger_write_time_update() had been to the file IO codepath. It was 
present
    there for other reasons: to setup the write-cache based on the file's size.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14320
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    (cherry picked from commit 2c19d27113036d607850f370bb9afd62856d671e)

commit dbff6af0acf36e2f377694d9f83a4a49d28b8ba6
Author: Ralph Boehme <[email protected]>
Date:   Wed Jan 22 10:52:39 2020 +0100

    smbd: avoid double chdir() in chdir_current_service()
    
    Since 8e81090789e4cc3ba9e5aa792d4e52971909c894 we're doing chdir() twice, 
first
    into conn->connectpath, then into conn->origpath.
    
    Before commit 8e81090789e4cc3ba9e5aa792d4e52971909c894 if
    chdir(conn->connectpath) succeeded, we wouldn't do the second chdir().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14256
    RN: smbd does a chdir() twice per request
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    
    Autobuild-User(master): Andreas Schneider <[email protected]>
    Autobuild-Date(master): Thu Feb  6 11:44:07 UTC 2020 on sn-devel-184
    
    (backported from commit f705629a171c1411131164f3adff36175154c093)

commit 0a8d442fe535e0bcb69e927449cd1f4b26975fb8
Author: Ralph Boehme <[email protected]>
Date:   Thu Mar 12 19:23:40 2020 +0100

    smbd: flush pending writetime update when setting timestamps file
    
    Cf the explanations in the previous commits.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14150
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    (back-ported from commit 7b90fe69a865ae8648b6548eabbcf2fa8237ebd8)

commit 4f5a5e5d6e73ecf60cd11be3cff25e2bb15ddb7d
Author: Ralph Boehme <[email protected]>
Date:   Thu Mar 12 19:23:40 2020 +0100

    smbd: flush pending writetime update when flushing file
    
    Cf the explanations in the previous commit.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14150
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    (back-ported from commit d99d5bf2c6d0a818ef2f3920e0c93fac38761c36)

commit 5f4a49bd9f658370a9516233a63e66e241990f2e
Author: Ralph Boehme <[email protected]>
Date:   Thu Mar 12 16:52:34 2020 +0100

    smbd: always flush pending write time update when setting filesize
    
    We need to flush a pending write time update even when we're setting the
    filesize to current filesize.
    
    Note that we're already doing it this way in the relevant places listed my
    dochelp@MS in
    
    https://lists.samba.org/archive/cifs-protocol/2019-December/003364.html
    
      Cleanup (= Close)
      SetBasicInfo
      SetAllocationInfo
      SetEndOfFileInfo
      SetValidDataLengthInfo
      Flush
      FSCTL_SET_ENCRYPTION
      FSCTL_OFFLOAD_WRITE
    
    Cleanup (= Close):
    
      Already implemented by update_write_time_on_close() and friends.
    
    SetBasicInfo:
    
      Currently doesn't flush pending updates. Fixed by a subsequent commit.
    
    SetAllocationInfo:
    
      smb_set_file_allocation_info() when setting a file's allocation size.
    
    SetEndOfFileInfo:
    
      Currently doesn't flush pending updates. Fixed by a subsequent commit.
    
    SetValidDataLengthInfo:
    
      Not implemented, returns NT_STATUS_NOT_SUPPORTED which seems wrong btw, as
      SetValidDataLengthInfo IS listed in MS-SMB2 2.2.39.
    
    Flush:
    
      Currently doesn't flush pending updates. Fixed by subsequent commit.
    
    FSCTL_SET_ENCRYPTION:
    
      Windows 2016 doesn't flush a pending writetime update, verified with a
      smbtorture test.
    
    FSCTL_OFFLOAD_WRITE:
    
      NT_STATUS_NOT_IMPLEMENTED
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14150
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    (back-ported from commit 79d7d6b9d01b8547f16b74a62926d0b471f18c39)

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

Summary of changes:
 source3/libads/ldap.c              |  1 +
 source3/smbd/fileio.c              | 17 +++--------------
 source3/smbd/reply.c               | 11 +++++++++++
 source3/smbd/service.c             | 25 ++++++++++++++-----------
 source3/smbd/smb2_flush.c          |  7 +++++++
 source3/smbd/trans2.c              | 32 +++++++++++++++++++++++++-------
 testprogs/blackbox/test_net_ads.sh | 17 +++++++++++++++++
 7 files changed, 78 insertions(+), 32 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
index 979192eb3ed..8ad76ed0ae9 100644
--- a/source3/libads/ldap.c
+++ b/source3/libads/ldap.c
@@ -1373,6 +1373,7 @@ char *ads_parent_dn(const char *dn)
                "userAccountControl",
                "DnsHostName",
                "ServicePrincipalName",
+               "userPrincipalName",
                "unicodePwd",
 
                /* Additional attributes Samba checks */
diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c
index 067ce5a9ad4..36ff6344a5d 100644
--- a/source3/smbd/fileio.c
+++ b/source3/smbd/fileio.c
@@ -169,15 +169,7 @@ void fsp_flush_write_time_update(struct files_struct *fsp)
 
        DEBUG(5, ("Update write time on %s\n", fsp_str_dbg(fsp)));
 
-       /* change the write time in the open file db. */
-       (void)set_write_time(fsp->file_id, timespec_current());
-
-       /* And notify. */
-        notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED,
-                     FILE_NOTIFY_CHANGE_LAST_WRITE, fsp->fsp_name->base_name);
-
-       /* Remove the timed event handler. */
-       TALLOC_FREE(fsp->update_write_time_event);
+       trigger_write_time_update_immediate(fsp);
 }
 
 static void update_write_time_handler(struct tevent_context *ctx,
@@ -277,17 +269,14 @@ void mark_file_modified(files_struct *fsp)
 {
        int dosmode;
 
+       trigger_write_time_update(fsp);
+
        if (fsp->modified) {
                return;
        }
 
        fsp->modified = true;
 
-       if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
-               return;
-       }
-       trigger_write_time_update(fsp);
-
        if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
                return;
        }
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 65ac729c732..9736077c8ad 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -5418,6 +5418,10 @@ static struct files_struct *file_sync_one_fn(struct 
files_struct *fsp,
        }
        sync_file(conn, fsp, True /* write through */);
 
+       if (fsp->modified) {
+               trigger_write_time_update_immediate(fsp);
+       }
+
        return NULL;
 }
 
@@ -5456,6 +5460,9 @@ void reply_flush(struct smb_request *req)
                        END_PROFILE(SMBflush);
                        return;
                }
+               if (fsp->modified) {
+                       trigger_write_time_update_immediate(fsp);
+               }
        }
 
        reply_outbuf(req, 0, 0);
@@ -8691,6 +8698,10 @@ void reply_setattrE(struct smb_request *req)
                goto out;
        }
 
+       if (fsp->modified) {
+               trigger_write_time_update_immediate(fsp);
+       }
+
        DEBUG( 3, ( "reply_setattrE %s actime=%u modtime=%u "
               " createtime=%u\n",
                fsp_fnum_dbg(fsp),
diff --git a/source3/smbd/service.c b/source3/smbd/service.c
index fd23d1a2d60..a4f7f898526 100644
--- a/source3/smbd/service.c
+++ b/source3/smbd/service.c
@@ -146,27 +146,30 @@ bool chdir_current_service(connection_struct *conn)
        const struct smb_filename origpath_fname = {
                .base_name = conn->origpath,
        };
+       int saved_errno = 0;
        int ret;
 
        conn->lastused_count++;
 
        ret = vfs_ChDir(conn, &connectpath_fname);
-       if (ret != 0) {
-               DEBUG(((errno!=EACCES)?0:3),
-                     ("chdir (%s) failed, reason: %s\n",
-                      conn->connectpath, strerror(errno)));
-               return false;
+       if (ret == 0) {
+               return true;
        }
+       saved_errno = errno;
+       DEBUG(((errno!=EACCES)?0:3),
+             ("chdir (%s) failed, reason: %s\n",
+              conn->connectpath, strerror(errno)));
 
        ret = vfs_ChDir(conn, &origpath_fname);
-       if (ret != 0) {
-               DEBUG(((errno!=EACCES)?0:3),
-                       ("chdir (%s) failed, reason: %s\n",
-                       conn->origpath, strerror(errno)));
-               return false;
+       if (ret == 0) {
+               return true;
        }
+       DEBUG(((errno!=EACCES)?0:3),
+             ("chdir (%s) failed, reason: %s\n",
+              conn->origpath, strerror(errno)));
 
-       return true;
+       errno = saved_errno;
+       return false;
 }
 
 /****************************************************************************
diff --git a/source3/smbd/smb2_flush.c b/source3/smbd/smb2_flush.c
index 470a8df4944..86dd14844e6 100644
--- a/source3/smbd/smb2_flush.c
+++ b/source3/smbd/smb2_flush.c
@@ -112,6 +112,7 @@ static void smbd_smb2_request_flush_done(struct tevent_req 
*subreq)
 
 struct smbd_smb2_flush_state {
        struct smbd_smb2_request *smb2req;
+       struct files_struct *fsp;
 };
 
 static void smbd_smb2_flush_done(struct tevent_req *subreq);
@@ -133,6 +134,7 @@ static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX 
*mem_ctx,
                return NULL;
        }
        state->smb2req = smb2req;
+       state->fsp = fsp;
 
        DEBUG(10,("smbd_smb2_flush: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
@@ -214,6 +216,8 @@ static void smbd_smb2_flush_done(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(
                subreq, struct tevent_req);
+       struct smbd_smb2_flush_state *state = tevent_req_data(
+               req, struct smbd_smb2_flush_state);
        int ret;
        struct vfs_aio_state vfs_aio_state;
 
@@ -223,6 +227,9 @@ static void smbd_smb2_flush_done(struct tevent_req *subreq)
                tevent_req_nterror(req, 
map_nt_error_from_unix(vfs_aio_state.error));
                return;
        }
+       if (state->fsp->modified) {
+               trigger_write_time_update_immediate(state->fsp);
+       }
        tevent_req_done(req);
 }
 
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 8164c8fd213..78dabc016ed 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -6567,6 +6567,13 @@ static NTSTATUS smb_set_file_size(connection_struct 
*conn,
                 get_file_size_stat(psbuf));
 
        if (size == get_file_size_stat(psbuf)) {
+               if (fsp == NULL) {
+                       return NT_STATUS_OK;
+               }
+               if (!fsp->modified) {
+                       return NT_STATUS_OK;
+               }
+               trigger_write_time_update_immediate(fsp);
                return NT_STATUS_OK;
        }
 
@@ -7704,8 +7711,15 @@ static NTSTATUS 
smb_set_file_basic_info(connection_struct *conn,
        DEBUG(10, ("smb_set_file_basic_info: file %s\n",
                   smb_fname_str_dbg(smb_fname)));
 
-       return smb_set_file_time(conn, fsp, smb_fname, &ft,
-                                true);
+       status = smb_set_file_time(conn, fsp, smb_fname, &ft, true);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       if (fsp != NULL && fsp->modified) {
+               trigger_write_time_update_immediate(fsp);
+       }
+       return NT_STATUS_OK;
 }
 
 /****************************************************************************
@@ -7742,11 +7756,15 @@ static NTSTATUS smb_set_info_standard(connection_struct 
*conn,
                return status;
        }
 
-        return smb_set_file_time(conn,
-                                fsp,
-                               smb_fname,
-                               &ft,
-                                true);
+       status = smb_set_file_time(conn, fsp, smb_fname, &ft, true);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       if (fsp != NULL && fsp->modified) {
+               trigger_write_time_update_immediate(fsp);
+       }
+       return NT_STATUS_OK;
 }
 
 /****************************************************************************
diff --git a/testprogs/blackbox/test_net_ads.sh 
b/testprogs/blackbox/test_net_ads.sh
index 8bcff006b8e..95c0cf76f90 100755
--- a/testprogs/blackbox/test_net_ads.sh
+++ b/testprogs/blackbox/test_net_ads.sh
@@ -237,6 +237,23 @@ testit "leave+createcomputer" $VALGRIND $net_tool ads 
leave -U$DC_USERNAME%$DC_P
 
 testit "Remove OU=Servers" $VALGRIND $ldbdel -U$DC_USERNAME%$DC_PASSWORD -H 
ldap://$SERVER "OU=Servers,$base_dn"
 
+#
+# Test createupn option of 'net ads join'
+#
+testit "join+createupn" $VALGRIND $net_tool ads join 
-U$DC_USERNAME%$DC_PASSWORD createupn="host/test-$HOSTNAME@$REALM" || 
failed=`expr $failed + 1`
+
+testit_grep "checkupn" "userPrincipalName: host/test-$HOSTNAME@$REALM" 
$ldbsearch -U$DC_USERNAME%$DC_PASSWORD -H ldap://$SERVER.$REALM -s base -b 
"CN=$HOSTNAME,CN=Computers,$base_dn" || failed=`expr $failed + 1`
+
+dedicated_keytab_file="$PREFIX_ABS/test_net_create_dedicated_krb5.keytab"
+
+testit "create_keytab" $VALGRIND $net_tool ads keytab create 
--option="kerberosmethod=dedicatedkeytab" 
--option="dedicatedkeytabfile=$dedicated_keytab_file" || failed=`expr $failed + 
1`
+
+testit_grep "checkupn+keytab" "host/test-$HOSTNAME@$REALM" $net_tool ads 
keytab list --option="kerberosmethod=dedicatedkeytab" 
--option="dedicatedkeytabfile=$dedicated_keytab_file" || failed=`expr $failed + 
1`
+
+rm -f $dedicated_keytab_file
+
+testit "leave+createupn" $VALGRIND $net_tool ads leave 
-U$DC_USERNAME%$DC_PASSWORD || failed=`expr $failed + 1`
+
 rm -rf $BASEDIR/$WORKDIR
 
 exit $failed


-- 
Samba Shared Repository

Reply via email to