diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/filename.c | 3 | ||||
-rw-r--r-- | source3/smbd/nttrans.c | 6 | ||||
-rw-r--r-- | source3/smbd/reply.c | 48 | ||||
-rw-r--r-- | source3/smbd/smb2_create.c | 3 | ||||
-rw-r--r-- | source3/smbd/smbd.h | 1 |
5 files changed, 34 insertions, 27 deletions
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 03e1d2dfa1..4384f5a5c0 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -723,7 +723,8 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx, * can only put stuff with permission -wx. */ if ((errno != 0) && (errno != ENOENT) - && (errno != EACCES)) { + && ((ucf_flags & UCF_CREATING_FILE) && + (errno != EACCES))) { /* * ENOTDIR and ELOOP both map to * NT_STATUS_OBJECT_PATH_NOT_FOUND diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index f5e5877d09..516b826796 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -538,7 +538,8 @@ void reply_ntcreate_and_X(struct smb_request *req) conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, + (create_disposition == FILE_CREATE) + ? UCF_CREATING_FILE : 0, NULL, &smb_fname); @@ -1163,7 +1164,8 @@ static void call_nt_transact_create(connection_struct *conn, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, + (create_disposition == FILE_CREATE) + ? UCF_CREATING_FILE : 0, NULL, &smb_fname); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 07b144e68b..2ae3ff4b1e 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1906,11 +1906,20 @@ void reply_open(struct smb_request *req) goto out; } + if (!map_open_params_to_ntcreate(fname, deny_mode, + OPENX_FILE_EXISTS_OPEN, &access_mask, + &share_mode, &create_disposition, + &create_options, &private_flags)) { + reply_force_doserror(req, ERRDOS, ERRbadaccess); + goto out; + } + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, + (create_disposition == FILE_CREATE) + ? UCF_CREATING_FILE : 0, NULL, &smb_fname); if (!NT_STATUS_IS_OK(status)) { @@ -1924,14 +1933,6 @@ void reply_open(struct smb_request *req) goto out; } - if (!map_open_params_to_ntcreate(smb_fname->base_name, deny_mode, - OPENX_FILE_EXISTS_OPEN, &access_mask, - &share_mode, &create_disposition, - &create_options, &private_flags)) { - reply_force_doserror(req, ERRDOS, ERRbadaccess); - goto out; - } - status = SMB_VFS_CREATE_FILE( conn, /* conn */ req, /* req */ @@ -2081,11 +2082,22 @@ void reply_open_and_X(struct smb_request *req) goto out; } + if (!map_open_params_to_ntcreate(fname, deny_mode, + smb_ofun, + &access_mask, &share_mode, + &create_disposition, + &create_options, + &private_flags)) { + reply_force_doserror(req, ERRDOS, ERRbadaccess); + goto out; + } + status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, + (create_disposition == FILE_CREATE) + ? UCF_CREATING_FILE : 0, NULL, &smb_fname); if (!NT_STATUS_IS_OK(status)) { @@ -2099,16 +2111,6 @@ void reply_open_and_X(struct smb_request *req) goto out; } - if (!map_open_params_to_ntcreate(smb_fname->base_name, deny_mode, - smb_ofun, - &access_mask, &share_mode, - &create_disposition, - &create_options, - &private_flags)) { - reply_force_doserror(req, ERRDOS, ERRbadaccess); - goto out; - } - status = SMB_VFS_CREATE_FILE( conn, /* conn */ req, /* req */ @@ -2328,7 +2330,7 @@ void reply_mknew(struct smb_request *req) conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, + UCF_CREATING_FILE, NULL, &smb_fname); if (!NT_STATUS_IS_OK(status)) { @@ -2469,7 +2471,7 @@ void reply_ctemp(struct smb_request *req) status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, + UCF_CREATING_FILE, NULL, &smb_fname); if (!NT_STATUS_IS_OK(status)) { @@ -5828,7 +5830,7 @@ void reply_mkdir(struct smb_request *req) status = filename_convert(ctx, conn, req->flags2 & FLAGS2_DFS_PATHNAMES, directory, - 0, + UCF_CREATING_FILE, NULL, &smb_dname); if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c index 6a43d274ff..ba743e76fa 100644 --- a/source3/smbd/smb2_create.c +++ b/source3/smbd/smb2_create.c @@ -841,7 +841,8 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, smb1req->conn, smb1req->flags2 & FLAGS2_DFS_PATHNAMES, fname, - 0, /* unix_convert flags */ + (in_create_disposition == FILE_CREATE) ? + UCF_CREATING_FILE : 0, NULL, /* ppath_contains_wcards */ &smb_fname); if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/smbd/smbd.h b/source3/smbd/smbd.h index a5b211a678..e76915730d 100644 --- a/source3/smbd/smbd.h +++ b/source3/smbd/smbd.h @@ -73,5 +73,6 @@ struct trans_state { #define UCF_COND_ALLOW_WCARD_LCOMP 0x00000004 #define UCF_POSIX_PATHNAMES 0x00000008 #define UCF_UNIX_NAME_LOOKUP 0x00000010 +#define UCF_CREATING_FILE 0x00000020 #endif /* _SMBD_SMBD_H */ |