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