access_mask needed for rename
Jeremy Allison
jra at samba.org
Wed Nov 2 20:30:51 UTC 2016
On Wed, Nov 02, 2016 at 01:07:23PM -0700, Jeremy Allison wrote:
> On Wed, Nov 02, 2016 at 11:29:33AM -0700, Kenny Dinh wrote:
> > Hi all,
> >
> > In the *can_rename* function in *source3/smbd/reply.c*, we check for of an
> > existing open handle's access_mask to have either DELETE_ACCESS or
> > FILE_WRITE_ATTRIBUTES to decide if the rename operation is allowed. This
> > means that if the file was opened with only FILE_WRITE_ATTRIBUTES without
> > DELETE_ACCESS, the rename would be allowed to go through. This failed the
> > smbtorture *smb2.rename.simple_no_delete *test.
> > The strict rule (which is what MS does) is to allow rename request to go
> > through only if DELETE_ACCESS is specified.
> >
> > Was there any reason to relax to rule, (and deviate from the behavior on MS
> > server), to allow the rename to go through even when the file handle was
> > opened with only the FILE_WRITE_ATTRIBUTES access_mask?
>
> There's a long history to this I recall.
>
> Can you try all possible rename tests with your change (remove
> the FILE_WRITE_ATTRIBUTES). Might be some issue with SMB1-only
> tests.
>
> This also may correspond to older code that didn't have a
> file handle.
>
> I do remember trying to remove this several years ago
> and not being able to.
Ah - now I remember. The problem is in the pathname-based
call to smb_file_rename_information(), via smbd_do_setfilepathinfo().
As I recall there is a test around this that checks
oplock breaks that SMB_FILE_RENAME_INFORMATION under
SMB1 fails with.
The one case where this is used is in:
source3/smbd/trans2.c:smb_file_rename_information()
7032 if (fsp) {
7033 DEBUG(10,("smb_file_rename_information: "
7034 "SMB_FILE_RENAME_INFORMATION (%s) %s -> %s\n",
7035 fsp_fnum_dbg(fsp), fsp_str_dbg(fsp),
7036 smb_fname_str_dbg(smb_fname_dst)));
7037 status = rename_internals_fsp(conn, fsp, smb_fname_dst, 0,
7038 overwrite);
7039 } else {
7040 DEBUG(10,("smb_file_rename_information: "
7041 "SMB_FILE_RENAME_INFORMATION %s -> %s\n",
7042 smb_fname_str_dbg(smb_fname_src),
7043 smb_fname_str_dbg(smb_fname_dst)));
7044 status = rename_internals(ctx, conn, req, smb_fname_src,
7045 smb_fname_dst, 0, overwrite, false,
7046 dest_has_wcard,
7047 FILE_WRITE_ATTRIBUTES);
7048 }
Note the 'FILE_WRITE_ATTRIBUTES' in line 7047.
If you change that to DELETE_ACCESS, something in the tests breaks :-).
Jeremy.
More information about the samba-technical
mailing list