From f45846084249540f3dee24fe92cfaab2974461cc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 6 Nov 2004 12:35:31 +0000 Subject: r3580: - on file overwrite in ntcreatex we need to replace the file permissions. - pvfs now passes BASE-OPENATTR - pvfs also passes the BASE-DEFER_OPEN test, but it is not a well formed test for regular running so I am removing it from the list of tests to run in test_posix.sh (the test is covered better by RAW-MUX anyway) (This used to be commit cb76bd218ed4194ea151264d495aa902ddf03b3c) --- source4/ntvfs/posix/pvfs_open.c | 16 ++++++++++++++++ source4/script/tests/test_posix.sh | 4 ++-- source4/torture/basic/attr.c | 16 ++++++++-------- 3 files changed, 26 insertions(+), 10 deletions(-) (limited to 'source4') diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c index f0c1478e66..f30d53d51a 100644 --- a/source4/ntvfs/posix/pvfs_open.c +++ b/source4/ntvfs/posix/pvfs_open.c @@ -787,6 +787,22 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs, return status; } + if (io->generic.in.open_disposition == NTCREATEX_DISP_OVERWRITE || + io->generic.in.open_disposition == NTCREATEX_DISP_OVERWRITE_IF) { + /* for overwrite we need to replace file permissions */ + uint32_t attrib = io->ntcreatex.in.file_attr | FILE_ATTRIBUTE_ARCHIVE; + mode_t mode = pvfs_fileperms(pvfs, attrib); + if (fchmod(fd, mode) == -1) { + return map_nt_error_from_unix(errno); + } + name->dos.attrib = attrib; + status = pvfs_dosattrib_save(pvfs, name, fd); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + } + + io->generic.out.oplock_level = NO_OPLOCK; io->generic.out.fnum = f->fnum; io->generic.out.create_action = NTCREATEX_ACTION_EXISTED; diff --git a/source4/script/tests/test_posix.sh b/source4/script/tests/test_posix.sh index 899878343b..2448408ce5 100755 --- a/source4/script/tests/test_posix.sh +++ b/source4/script/tests/test_posix.sh @@ -35,13 +35,13 @@ tests="$tests BASE-DENY2 BASE-TCON BASE-TCONDEV BASE-RW1" tests="$tests BASE-DENY3 BASE-XCOPY BASE-OPEN" tests="$tests BASE-DELETE BASE-PROPERTIES BASE-MANGLE" tests="$tests BASE-CHKPATH BASE-SECLEAK BASE-TRANS2" -tests="$tests BASE-NTDENY1 BASE-NTDENY2 BASE-RENAME" +tests="$tests BASE-NTDENY1 BASE-NTDENY2 BASE-RENAME BASE-OPENATTR" tests="$tests RAW-QFSINFO RAW-QFILEINFO RAW-SFILEINFO-BUG" tests="$tests RAW-LOCK RAW-MKDIR RAW-SEEK RAW-CONTEXT RAW-MUX RAW-OPEN" tests="$tests RAW-UNLINK RAW-READ RAW-CLOSE RAW-IOCTL RAW-SEARCH RAW-CHKPATH" tests="$tests LOCAL-ICONV LOCAL-TALLOC LOCAL-MESSAGING LOCAL-BINDING LOCAL-IDTREE" -soon="BASE-DENY1 BASE-DEFER_OPEN BASE-OPENATTR BASE-CHARSET" +soon="BASE-DENY1 BASE-CHARSET" soon="$soon RAW-SFILEINFO RAW-OPLOCK RAW-NOTIFY" soon="$soon RAW-WRITE RAW-RENAME" diff --git a/source4/torture/basic/attr.c b/source4/torture/basic/attr.c index b70b1c2617..5cd05d9647 100644 --- a/source4/torture/basic/attr.c +++ b/source4/torture/basic/attr.c @@ -104,8 +104,8 @@ BOOL torture_openattrtest(void) smbcli_setatr(cli1->tree, fname, 0, 0); smbcli_unlink(cli1->tree, fname); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SA_RIGHT_FILE_WRITE_DATA, open_attrs_table[i], - NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); - + NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); + if (fnum1 == -1) { printf("open %d (1) of %s failed (%s)\n", i, fname, smbcli_errstr(cli1->tree)); return False; @@ -166,13 +166,13 @@ BOOL torture_openattrtest(void) for (l = 0; l < ARRAY_SIZE(attr_results); l++) { if (attr_results[l].num == k) { if (attr != attr_results[l].result_attr || - open_attrs_table[i] != attr_results[l].init_attr || - open_attrs_table[j] != attr_results[l].trunc_attr) { + open_attrs_table[i] != attr_results[l].init_attr || + open_attrs_table[j] != attr_results[l].trunc_attr) { printf("[%d] getatr check failed. [0x%x] trunc [0x%x] got attr 0x%x, should be 0x%x\n", - k, open_attrs_table[i], - open_attrs_table[j], - (uint_t)attr, - attr_results[l].result_attr); + k, open_attrs_table[i], + open_attrs_table[j], + (uint_t)attr, + attr_results[l].result_attr); correct = False; CHECK_MAX_FAILURES(error_exit); } -- cgit