The branch, master has been updated via c66f6c58c7b torture/smb2: do not use client time in delayed timestamp updates test via bea154c9c13 lib: Fix tdb_validate() for incorrect tdb entries via 12c8b67ef63 torture3: Add tdb-validate test from 47f401095ea smbd: squash check_path_syntax() variants
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit c66f6c58c7b5ceb9185cb5dd70b7c261c817a021 Author: Amir Goldstein <a...@ctera.com> Date: Tue Mar 14 19:57:08 2023 +0200 torture/smb2: do not use client time in delayed timestamp updates test Client time cannot be compared to server timestamp, because the clocks on client and server may not be in sync. Compare server timestamps, only to previous timestamps read from server. Signed-off-by: Amir Goldstein <a...@ctera.com> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Ralph Böhme <s...@samba.org> Autobuild-Date(master): Sat Apr 1 06:23:36 UTC 2023 on atb-devel-224 commit bea154c9c13e2849eadcaccc1d5acccf9a3b8931 Author: Volker Lendecke <v...@samba.org> Date: Wed Mar 29 06:20:01 2023 -0400 lib: Fix tdb_validate() for incorrect tdb entries We should not overwrite the "rc=1" initialization with the tdb_check retval. This will lead to tdb_validate_child() returning 0 even when validate_fn() found invalid entries. Bug: https://bugzilla.samba.org/show_bug.cgi?id=14789 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 12c8b67ef6355f9527b53f274cc7a1acc1648dcb Author: Volker Lendecke <v...@samba.org> Date: Wed Mar 29 09:07:19 2023 -0400 torture3: Add tdb-validate test Bug: https://bugzilla.samba.org/show_bug.cgi?id=14789 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/lib/tdb_validate.c | 5 +-- source3/selftest/tests.py | 1 + source3/torture/proto.h | 1 + source3/torture/test_tdb_validate.c | 68 +++++++++++++++++++++++++++++++++++++ source3/torture/torture.c | 4 +++ source3/torture/wscript_build | 2 ++ source4/torture/smb2/timestamps.c | 7 ++-- 7 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 source3/torture/test_tdb_validate.c Changeset truncated at 500 lines: diff --git a/source3/lib/tdb_validate.c b/source3/lib/tdb_validate.c index 9db182fb0b3..78bd824c09d 100644 --- a/source3/lib/tdb_validate.c +++ b/source3/lib/tdb_validate.c @@ -31,6 +31,7 @@ static int tdb_validate_child(struct tdb_context *tdb, tdb_validate_data_func validate_fn) { int ret = 1; + int check_rc; int num_entries = 0; struct tdb_validation_status v_status; @@ -50,8 +51,8 @@ static int tdb_validate_child(struct tdb_context *tdb, * we can simplify this by passing a check function, * but I don't want to change all the callers... */ - ret = tdb_check(tdb, NULL, NULL); - if (ret != 0) { + check_rc = tdb_check(tdb, NULL, NULL); + if (check_rc != 0) { v_status.tdb_error = True; v_status.success = False; goto out; diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index 31112d4be9f..47234896ed6 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -503,6 +503,7 @@ local_tests = [ "LOCAL-G-LOCK8", "LOCAL-NAMEMAP-CACHE1", "LOCAL-IDMAP-CACHE1", + "LOCAL-TDB-VALIDATE", "LOCAL-hex_encode_buf", "LOCAL-remove_duplicate_addrs2"] diff --git a/source3/torture/proto.h b/source3/torture/proto.h index 5e6d914c3da..a67a771ef45 100644 --- a/source3/torture/proto.h +++ b/source3/torture/proto.h @@ -176,5 +176,6 @@ bool run_hidenewfiles_showdirs(int dummy); bool run_readdir_timestamp(int dummy); bool run_ctdbd_conn1(int dummy); bool run_rpc_scale(int dummy); +bool run_tdb_validate(int dummy); #endif /* __TORTURE_H__ */ diff --git a/source3/torture/test_tdb_validate.c b/source3/torture/test_tdb_validate.c new file mode 100644 index 00000000000..4768512e159 --- /dev/null +++ b/source3/torture/test_tdb_validate.c @@ -0,0 +1,68 @@ +/* + * Unix SMB/CIFS implementation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "source3/include/includes.h" +#include <tdb.h> +#include "source3/torture/proto.h" +#include "source3/lib/tdb_validate.h" + +static int validate_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA value, + void *private_data) +{ + struct tdb_validation_status *state = private_data; + state->success = false; + printf("validate_fn called\n"); + return -1; +} + +bool run_tdb_validate(int dummy) +{ + const char tdb_name[] = "tdb_validate.tdb"; + bool result = false; + struct tdb_context *tdb = NULL; + char buf[] = "data"; + TDB_DATA data = { .dptr = (uint8_t *)buf, .dsize = sizeof(buf), }; + int ret; + + unlink(tdb_name); + + tdb = tdb_open(tdb_name, 0, 0, O_CREAT|O_EXCL|O_RDWR, 0600); + if (tdb == NULL) { + perror("Could not open tdb"); + goto done; + } + + ret = tdb_store(tdb, data, data, 0); + if (ret == -1) { + perror("tdb_store failed"); + goto done; + } + + ret = tdb_validate(tdb, validate_fn); + if (ret == 0) { + fprintf(stderr, + "tdb_validate succeeded where it should have " + "failed\n"); + goto done; + } + + result = true; +done: + tdb_close(tdb); + unlink(tdb_name); + return result; +} diff --git a/source3/torture/torture.c b/source3/torture/torture.c index c63db3f9385..a2db49ea45f 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -15635,6 +15635,10 @@ static struct { .name = "rpc-scale", .fn = run_rpc_scale, }, + { + .name = "LOCAL-TDB-VALIDATE", + .fn = run_tdb_validate, + }, { .name = NULL, }, diff --git a/source3/torture/wscript_build b/source3/torture/wscript_build index 1df5d88cd31..1d2520099e3 100644 --- a/source3/torture/wscript_build +++ b/source3/torture/wscript_build @@ -59,6 +59,7 @@ bld.SAMBA3_BINARY('smbtorture' + bld.env.suffix3, test_hidenewfiles.c test_readdir_timestamp.c test_rpc_scale.c + test_tdb_validate.c ''' + TORTURE3_ADDITIONAL_SOURCE, deps=''' talloc @@ -75,6 +76,7 @@ bld.SAMBA3_BINARY('smbtorture' + bld.env.suffix3, libcli_lsa3 samba-cluster-support util_sd + TDB_VALIDATE ''', cflags='-DWINBINDD_SOCKET_DIR=\"%s\"' % bld.env.WINBINDD_SOCKET_DIR, for_selftest=True) diff --git a/source4/torture/smb2/timestamps.c b/source4/torture/smb2/timestamps.c index 33160b06765..f8fb676e44f 100644 --- a/source4/torture/smb2/timestamps.c +++ b/source4/torture/smb2/timestamps.c @@ -1064,8 +1064,6 @@ static bool test_delayed_2write(struct torture_context *tctx, NTTIME create_time; NTTIME write_time; NTTIME write_time2; - struct timespec now; - NTTIME send_close_time; NTTIME close_time; NTSTATUS status; bool ret = true; @@ -1141,8 +1139,7 @@ static bool test_delayed_2write(struct torture_context *tctx, torture_comment(tctx, "Close file-handle 1\n"); sleep(2); - now = timespec_current(); - send_close_time = full_timespec_to_nt_time(&now); + torture_comment(tctx, "Check writetime has been updated\n"); c = (struct smb2_close) { .in.file.handle = h1, @@ -1155,7 +1152,7 @@ static bool test_delayed_2write(struct torture_context *tctx, ZERO_STRUCT(h1); close_time = c.out.write_time; - if (!(close_time > send_close_time)) { + if (!(close_time > write_time)) { ret = false; torture_fail_goto(tctx, done, "Write-time not updated (wrong!)\n"); -- Samba Shared Repository