From 99c559cd58478ae6bf6a2cb88293b0ab240a8e1f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 1 Feb 2006 05:20:54 +0000 Subject: r13276: start to work towards the BASE-DELETE test passing. This change ensures that we give the right error code to opens that are denied due to the file having delete pending set (This used to be commit c5b709fae66f9135e5c0e2eeb2e25dd8837b64de) --- source4/ntvfs/common/opendb.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'source4/ntvfs/common') diff --git a/source4/ntvfs/common/opendb.c b/source4/ntvfs/common/opendb.c index 7d45f38840..af7be199f7 100644 --- a/source4/ntvfs/common/opendb.c +++ b/source4/ntvfs/common/opendb.c @@ -154,10 +154,12 @@ struct odb_lock *odb_lock(TALLOC_CTX *mem_ctx, /* determine if two odb_entry structures conflict + + return NT_STATUS_OK on no conflict */ -static BOOL share_conflict(struct odb_entry *e1, struct odb_entry *e2) +static NTSTATUS share_conflict(struct odb_entry *e1, struct odb_entry *e2) { - if (e1->pending || e2->pending) return False; + if (e1->pending || e2->pending) return NT_STATUS_OK; /* if either open involves no read.write or delete access then it can't conflict */ @@ -166,25 +168,25 @@ static BOOL share_conflict(struct odb_entry *e1, struct odb_entry *e2) SEC_FILE_READ_DATA | SEC_FILE_EXECUTE | SEC_STD_DELETE))) { - return False; + return NT_STATUS_OK; } if (!(e2->access_mask & (SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA | SEC_FILE_READ_DATA | SEC_FILE_EXECUTE | SEC_STD_DELETE))) { - return False; + return NT_STATUS_OK; } /* data IO access masks. This is skipped if the two open handles are on different streams (as in that case the masks don't interact) */ if (e1->stream_id != e2->stream_id) { - return False; + return NT_STATUS_OK; } #define CHECK_MASK(am, right, sa, share) \ - if (((am) & (right)) && !((sa) & (share))) return True + if (((am) & (right)) && !((sa) & (share))) return NT_STATUS_SHARING_VIOLATION CHECK_MASK(e1->access_mask, SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA, e2->share_access, NTCREATEX_SHARE_ACCESS_WRITE); @@ -204,10 +206,10 @@ static BOOL share_conflict(struct odb_entry *e1, struct odb_entry *e2) /* if a delete is pending then a second open is not allowed */ if ((e1->create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) || (e2->create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE)) { - return True; + return NT_STATUS_DELETE_PENDING; } - return False; + return NT_STATUS_OK; } /* @@ -242,9 +244,11 @@ NTSTATUS odb_open_file(struct odb_lock *lck, void *file_handle, count = dbuf.dsize / sizeof(struct odb_entry); for (i=0;i