mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
r1255: Ensure we check attributes correctly on rename request. Gets us further with
Samba4 RAW-RENAME test.
Jeremy.
(This used to be commit f17382ad8a
)
This commit is contained in:
parent
af5750d3ba
commit
073c542c51
@ -1428,15 +1428,20 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
|
||||
Check if a user is allowed to rename a file.
|
||||
********************************************************************/
|
||||
|
||||
static NTSTATUS can_rename(char *fname,connection_struct *conn, SMB_STRUCT_STAT *pst)
|
||||
static NTSTATUS can_rename(char *fname,connection_struct *conn, uint16 dirtype, SMB_STRUCT_STAT *pst)
|
||||
{
|
||||
int smb_action;
|
||||
int access_mode;
|
||||
files_struct *fsp;
|
||||
uint16 fmode;
|
||||
|
||||
if (!CAN_WRITE(conn))
|
||||
return NT_STATUS_MEDIA_WRITE_PROTECTED;
|
||||
|
||||
|
||||
fmode = dos_mode(conn,fname,pst);
|
||||
if ((fmode & ~dirtype) & (aHIDDEN | aSYSTEM))
|
||||
return NT_STATUS_NO_SUCH_FILE;
|
||||
|
||||
if (S_ISDIR(pst->st_mode))
|
||||
return NT_STATUS_OK;
|
||||
|
||||
@ -3543,7 +3548,7 @@ static void rename_open_files(connection_struct *conn, SMB_DEV_T dev, SMB_INO_T
|
||||
Rename an open file - given an fsp.
|
||||
****************************************************************************/
|
||||
|
||||
NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, char *newname, BOOL replace_if_exists)
|
||||
NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, char *newname, uint16 attrs, BOOL replace_if_exists)
|
||||
{
|
||||
SMB_STRUCT_STAT sbuf;
|
||||
BOOL bad_path = False;
|
||||
@ -3624,7 +3629,7 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, char *
|
||||
return NT_STATUS_OBJECT_NAME_COLLISION;
|
||||
}
|
||||
|
||||
error = can_rename(newname,conn,&sbuf);
|
||||
error = can_rename(newname,conn,attrs,&sbuf);
|
||||
|
||||
if (dest_exists && !NT_STATUS_IS_OK(error)) {
|
||||
DEBUG(3,("rename_internals: Error %s rename %s -> %s\n",
|
||||
@ -3830,7 +3835,7 @@ directory = %s, newname = %s, last_component_dest = %s, is_8_3 = %d\n",
|
||||
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
|
||||
}
|
||||
|
||||
error = can_rename(directory,conn,&sbuf1);
|
||||
error = can_rename(directory,conn,attrs,&sbuf1);
|
||||
|
||||
if (!NT_STATUS_IS_OK(error)) {
|
||||
DEBUG(3,("rename_internals: Error %s rename %s -> %s\n",
|
||||
@ -3921,7 +3926,7 @@ directory = %s, newname = %s, last_component_dest = %s, is_8_3 = %d\n",
|
||||
DEBUG(6,("rename %s failed. Error %s\n", fname, nt_errstr(error)));
|
||||
continue;
|
||||
}
|
||||
error = can_rename(fname,conn,&sbuf1);
|
||||
error = can_rename(fname,conn,attrs,&sbuf1);
|
||||
if (!NT_STATUS_IS_OK(error)) {
|
||||
DEBUG(6,("rename %s refused\n", fname));
|
||||
continue;
|
||||
|
@ -3550,7 +3550,7 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
|
||||
if (fsp) {
|
||||
DEBUG(10,("call_trans2setfilepathinfo: SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n",
|
||||
fsp->fnum, fsp->fsp_name, base_name ));
|
||||
status = rename_internals_fsp(conn, fsp, base_name, overwrite);
|
||||
status = rename_internals_fsp(conn, fsp, base_name, 0, overwrite);
|
||||
} else {
|
||||
DEBUG(10,("call_trans2setfilepathinfo: SMB_FILE_RENAME_INFORMATION %s -> %s\n",
|
||||
fname, newname ));
|
||||
|
Loading…
Reference in New Issue
Block a user