summaryrefslogtreecommitdiff
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
parent88c96c12f0e9f387311f6e0b428ae99ba4fb99bc (diff)
downloadsamba-913591bea2b40fd4028efc7606c90a8c3a948898.tar.gz
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.
-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.