diff options
author | Jeremy Allison <jra@samba.org> | 2004-05-19 02:25:48 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 10:51:37 -0500 |
commit | 28cbc5f8f9489673b0c766f450a681659a2a0387 (patch) | |
tree | 08cd98687b08b30896b1ccfe70bb5d4d9b761841 /source3/smbd | |
parent | 84cea46162d6328c2e3bc0166f5b27a0fa01b3f9 (diff) | |
download | samba-28cbc5f8f9489673b0c766f450a681659a2a0387.tar.gz samba-28cbc5f8f9489673b0c766f450a681659a2a0387.tar.bz2 samba-28cbc5f8f9489673b0c766f450a681659a2a0387.zip |
r779: Fix specific case of open that doesn't cause oplock break, or share mode check.
Test case provided by Volker will be added later. There may be other tests
needed.
Jeremy.
(This used to be commit 1f8e7946edbb2930ba5f9738688dc843bc368fbf)
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/open.c | 27 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 2 |
2 files changed, 22 insertions, 7 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index f072dc4be4..3b4f50b065 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -805,6 +805,25 @@ files_struct *open_file_shared1(connection_struct *conn,char *fname, SMB_STRUCT_ return print_fsp_open(conn, fname); } + if (desired_access && ((desired_access & ~(SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES))==0) && + ((desired_access & (SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES)) != 0)) { + /* Stat open that doesn't trigger oplock breaks or share mode checks... ! JRA. */ + oplock_request = 0; + fsp = open_file_stat(conn, fname, psbuf); + if (!fsp) + return NULL; + + fsp->desired_access = desired_access; + if (Access) + *Access = DOS_OPEN_RDONLY; + if (paction) + *paction = FILE_WAS_OPENED; + + DEBUG(10,("open_file_shared: stat open for fname = %s share_mode = %x\n", + fname, share_mode )); + return fsp; + } + fsp = file_new(conn); if(!fsp) return NULL; @@ -1427,12 +1446,8 @@ files_struct *open_file_stat(connection_struct *conn, char *fname, SMB_STRUCT_ST */ fsp->mode = psbuf->st_mode; - /* - * Don't store dev or inode, we don't want any iterator - * to see this. - */ - fsp->inode = (SMB_INO_T)0; - fsp->dev = (SMB_DEV_T)0; + fsp->inode = psbuf->st_ino; + fsp->dev = psbuf->st_dev; fsp->size = psbuf->st_size; fsp->vuid = current_user.vuid; fsp->file_pid = global_smbpid; diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 23272752c6..738d12e020 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -2302,7 +2302,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn, return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRbadpath); } - delete_pending = fsp->directory_delete_on_close; + delete_pending = fsp->is_directory ? fsp->directory_delete_on_close : 0; } else { /* * Original code - this is an open file. |