summaryrefslogtreecommitdiffstats
path: root/source/smbd
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-05-19 02:25:48 +0000
committerJeremy Allison <jra@samba.org>2004-05-19 02:25:48 +0000
commit913591bea2b40fd4028efc7606c90a8c3a948898 (patch)
tree52d57a60a3eea6d3138129314c9ed629ffd8d6ad /source/smbd
parent88c96c12f0e9f387311f6e0b428ae99ba4fb99bc (diff)
downloadsamba-913591bea2b40fd4028efc7606c90a8c3a948898.tar.gz
samba-913591bea2b40fd4028efc7606c90a8c3a948898.tar.xz
samba-913591bea2b40fd4028efc7606c90a8c3a948898.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.
Diffstat (limited to 'source/smbd')
-rw-r--r--source/smbd/open.c27
-rw-r--r--source/smbd/trans2.c2
2 files changed, 22 insertions, 7 deletions
diff --git a/source/smbd/open.c b/source/smbd/open.c
index f072dc4be47..3b4f50b0656 100644
--- a/source/smbd/open.c
+++ b/source/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/source/smbd/trans2.c b/source/smbd/trans2.c
index 23272752c6b..738d12e020f 100644
--- a/source/smbd/trans2.c
+++ b/source/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.