From f2269e6cc85ffcd38134df2e430c4c0fabde17f8 Mon Sep 17 00:00:00 2001 From: Tim Prouty Date: Fri, 9 Jan 2009 11:07:45 -0800 Subject: s3: Fix open path to delete streams depending on the create disposition The new create disposition test in smbtorture RAW-STREAMS verifies this fix. --- source3/smbd/open.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 52e31dfc23..7d23b92359 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -1330,6 +1330,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, bool def_acl = False; bool posix_open = False; bool new_file_created = False; + bool clear_ads = false; struct file_id id; NTSTATUS fsp_open = NT_STATUS_ACCESS_DENIED; mode_t new_unx_mode = (mode_t)0; @@ -1461,12 +1462,14 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, /* If file exists replace/overwrite. If file doesn't * exist create. */ flags2 |= (O_CREAT | O_TRUNC); + clear_ads = true; break; case FILE_OVERWRITE_IF: /* If file exists replace/overwrite. If file doesn't * exist create. */ flags2 |= (O_CREAT | O_TRUNC); + clear_ads = true; break; case FILE_OPEN: @@ -1491,6 +1494,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } flags2 |= O_TRUNC; + clear_ads = true; break; case FILE_CREATE: @@ -1925,6 +1929,16 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, SMB_ASSERT(lck != NULL); + /* Delete streams if create_disposition requires it */ + if (file_existed && clear_ads) { + status = delete_all_streams(conn, fname); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(lck); + fd_close(fsp); + return status; + } + } + /* note that we ignore failure for the following. It is basically a hack for NFS, and NFS will never set one of these only read them. Nobody but Samba can ever set a deny -- cgit