summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-05-19 02:25:48 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:51:37 -0500
commit28cbc5f8f9489673b0c766f450a681659a2a0387 (patch)
tree08cd98687b08b30896b1ccfe70bb5d4d9b761841
parent84cea46162d6328c2e3bc0166f5b27a0fa01b3f9 (diff)
downloadsamba-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)
-rw-r--r--source3/smbd/open.c27
-rw-r--r--source3/smbd/trans2.c2
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.