X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source3%2Fsmbd%2Ftrans2.c;h=65c50336f6f179ab915574a8a0c5ac00b7a9e2c5;hb=49ec754fca7beaacb852facc6cfecdfedbc89e45;hp=19706d32bd5d24b4b85aae3a26066a40c79ef273;hpb=cb996cd5a3570e1cd6bf92776acd7c8cd22ebbfd;p=amitay%2Fsamba.git diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 19706d32bd5..65c50336f6f 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -192,24 +192,20 @@ done: #endif /******************************************************************** - The canonical "check access" based on object handle or path function. + The canonical "check access" based on path. ********************************************************************/ static NTSTATUS check_access(connection_struct *conn, - files_struct *fsp, - const struct smb_filename *smb_fname, - uint32_t access_mask) + struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + uint32_t access_mask) { - NTSTATUS status; - - if (fsp) { - status = check_access_fsp(fsp, access_mask); - } else { - status = smbd_check_access_rights(conn, smb_fname, - false, access_mask); - } - - return status; + SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp); + return smbd_check_access_rights(conn, + dirfsp, + smb_fname, + false, + access_mask); } /******************************************************************** @@ -820,7 +816,14 @@ NTSTATUS set_ea(connection_struct *conn, files_struct *fsp, return status; } - status = check_access(conn, fsp, smb_fname, FILE_WRITE_EA); + if (fsp != NULL) { + status = check_access_fsp(fsp, FILE_WRITE_EA); + } else { + status = check_access(conn, + conn->cwd_fsp, + smb_fname, + FILE_WRITE_EA); + } if (!NT_STATUS_IS_OK(status)) { return status; } @@ -7833,7 +7836,14 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn, return NT_STATUS_INVALID_PARAMETER; } - status = check_access(conn, fsp, smb_fname, FILE_WRITE_ATTRIBUTES); + if (fsp != NULL) { + status = check_access_fsp(fsp, FILE_WRITE_ATTRIBUTES); + } else { + status = check_access(conn, + conn->cwd_fsp, + smb_fname, + FILE_WRITE_ATTRIBUTES); + } if (!NT_STATUS_IS_OK(status)) { return status; } @@ -7900,7 +7910,14 @@ static NTSTATUS smb_set_info_standard(connection_struct *conn, DEBUG(10,("smb_set_info_standard: file %s\n", smb_fname_str_dbg(smb_fname))); - status = check_access(conn, fsp, smb_fname, FILE_WRITE_ATTRIBUTES); + if (fsp != NULL) { + status = check_access_fsp(fsp, FILE_WRITE_ATTRIBUTES); + } else { + status = check_access(conn, + conn->cwd_fsp, + smb_fname, + FILE_WRITE_ATTRIBUTES); + } if (!NT_STATUS_IS_OK(status)) { return status; } @@ -8143,14 +8160,21 @@ static NTSTATUS smb_unix_mknod(connection_struct *conn, */ if (lp_inherit_permissions(SNUM(conn))) { - char *parent; - if (!parent_dirname(talloc_tos(), smb_fname->base_name, - &parent, NULL)) { + struct smb_filename *parent_fname = NULL; + bool ok; + + ok = parent_smb_fname(talloc_tos(), + smb_fname, + &parent_fname, + NULL); + if (!ok) { return NT_STATUS_NO_MEMORY; } - inherit_access_posix_acl(conn, parent, smb_fname, + inherit_access_posix_acl(conn, + parent_fname, + smb_fname, unixmode); - TALLOC_FREE(parent); + TALLOC_FREE(parent_fname); } return NT_STATUS_OK;