1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

s3: torture: Add regression test for renaming SMB1+POSIX symlinks, dangling and real.

Mark as knownfail.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Noel Power <noel.power@suse.com>
This commit is contained in:
Jeremy Allison 2021-05-21 11:14:19 -07:00 committed by Noel Power
parent 6917e32466
commit 0c2ceb0435
5 changed files with 142 additions and 0 deletions

View File

@ -0,0 +1,2 @@
^samba3.smbtorture_s3.plain.POSIX-SYMLINK-RENAME.smbtorture\(nt4_dc_smb1\)
^samba3.smbtorture_s3.crypt.POSIX-SYMLINK-RENAME.smbtorture\(nt4_dc_smb1\)

View File

@ -265,6 +265,7 @@ posix_tests = ["POSIX", "POSIX-APPEND", "POSIX-SYMLINK-ACL", "POSIX-SYMLINK-EA",
"POSIX-SYMLINK-PARENT",
"POSIX-SYMLINK-CHMOD",
"POSIX-DIR-DEFAULT-ACL",
"POSIX-SYMLINK-RENAME",
]
for t in posix_tests:

View File

@ -93,6 +93,7 @@ bool run_posix_symlink_parent_test(int dummy);
bool run_posix_symlink_chmod_test(int dummy);
bool run_posix_dir_default_acl_test(int dummy);
bool run_case_insensitive_create(int dummy);
bool run_posix_symlink_rename_test(int dummy);
bool run_nbench2(int dummy);
bool run_async_echo(int dummy);

View File

@ -1309,3 +1309,137 @@ out:
TALLOC_FREE(frame);
return correct;
}
/*
Ensure we can rename a symlink whether it is
pointing to a real object or dangling.
*/
bool run_posix_symlink_rename_test(int dummy)
{
TALLOC_CTX *frame = NULL;
struct cli_state *cli_unix = NULL;
NTSTATUS status;
uint16_t fnum = (uint16_t)-1;
const char *fname_real = "file_real";
const char *fname_real_symlink = "file_real_symlink";
const char *fname_real_symlink_newname = "rename_file_real_symlink";
const char *nonexist = "nonexist";
const char *nonexist_symlink = "dangling_symlink";
const char *nonexist_symlink_newname = "dangling_symlink_rename";
bool correct = false;
frame = talloc_stackframe();
printf("Starting POSIX-SYMLINK-RENAME test\n");
if (!torture_open_connection(&cli_unix, 0)) {
TALLOC_FREE(frame);
return false;
}
torture_conn_set_sockopt(cli_unix);
status = torture_setup_unix_extensions(cli_unix);
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(frame);
return false;
}
/* Start with a clean slate. */
cli_posix_unlink(cli_unix, fname_real);
cli_posix_unlink(cli_unix, fname_real_symlink);
cli_posix_unlink(cli_unix, fname_real_symlink_newname);
cli_posix_unlink(cli_unix, nonexist);
cli_posix_unlink(cli_unix, nonexist_symlink);
cli_posix_unlink(cli_unix, nonexist_symlink_newname);
/* Create a real file. */
status = cli_posix_open(cli_unix,
fname_real,
O_RDWR|O_CREAT,
0644,
&fnum);
if (!NT_STATUS_IS_OK(status)) {
printf("cli_posix_open of %s failed error %s\n",
fname_real,
nt_errstr(status));
goto out;
}
status = cli_close(cli_unix, fnum);
if (!NT_STATUS_IS_OK(status)) {
printf("cli_close failed %s\n", nt_errstr(status));
goto out;
}
fnum = (uint16_t)-1;
/* Create symlink to real target. */
status = cli_posix_symlink(cli_unix,
fname_real,
fname_real_symlink);
if (!NT_STATUS_IS_OK(status)) {
printf("cli_posix_symlink of %s -> %s failed error %s\n",
fname_real_symlink,
fname_real,
nt_errstr(status));
goto out;
}
/* Ensure we can rename the symlink to the real file. */
status = cli_rename(cli_unix,
fname_real_symlink,
fname_real_symlink_newname,
false);
if (!NT_STATUS_IS_OK(status)) {
printf("cli_rename of %s -> %s failed %s\n",
fname_real_symlink,
fname_real_symlink_newname,
nt_errstr(status));
goto out;
}
/* Now create symlink to non-existing target. */
status = cli_posix_symlink(cli_unix,
nonexist,
nonexist_symlink);
if (!NT_STATUS_IS_OK(status)) {
printf("cli_posix_symlink of %s -> %s failed error %s\n",
nonexist_symlink,
nonexist,
nt_errstr(status));
goto out;
}
/* Ensure we can rename the dangling symlink. */
status = cli_rename(cli_unix,
nonexist_symlink,
nonexist_symlink_newname,
false);
if (!NT_STATUS_IS_OK(status)) {
printf("cli_rename of %s -> %s failed %s\n",
nonexist_symlink,
nonexist_symlink_newname,
nt_errstr(status));
goto out;
}
printf("POSIX-SYMLINK-RENAME test passed\n");
correct = true;
out:
if (fnum != (uint16_t)-1) {
cli_close(cli_unix, fnum);
}
cli_posix_unlink(cli_unix, fname_real);
cli_posix_unlink(cli_unix, fname_real_symlink);
cli_posix_unlink(cli_unix, fname_real_symlink_newname);
cli_posix_unlink(cli_unix, nonexist);
cli_posix_unlink(cli_unix, nonexist_symlink);
cli_posix_unlink(cli_unix, nonexist_symlink_newname);
if (!torture_close_connection(cli_unix)) {
correct = false;
}
TALLOC_FREE(frame);
return correct;
}

View File

@ -14955,6 +14955,10 @@ static struct {
.name = "POSIX-SYMLINK-CHMOD",
.fn = run_posix_symlink_chmod_test,
},
{
.name = "POSIX-SYMLINK-RENAME",
.fn = run_posix_symlink_rename_test,
},
{
.name = "POSIX-DIR-DEFAULT-ACL",
.fn = run_posix_dir_default_acl_test,