summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2005-08-24 13:15:01 +0000
committerVolker Lendecke <vlendec@samba.org>2005-08-24 13:15:01 +0000
commitfa5776b76d40d2505f5ea30e77bfce192bd53ded (patch)
treeb672733f24261afb7d52c67b11360abc17ef589e
parent75a969045860609ee51df1134b2ee24dce50c830 (diff)
downloadsamba-fa5776b76d40d2505f5ea30e77bfce192bd53ded.tar.gz
samba-fa5776b76d40d2505f5ea30e77bfce192bd53ded.tar.xz
samba-fa5776b76d40d2505f5ea30e77bfce192bd53ded.zip
r9584: Fix a race condition in Samba 3. If two files are opened simultaneously with
NTCREATEX_DISP_CREATE (create if not exists, else fail) they might end up with two or more times NT_STATUS_OK as EEXIST is not correctly handled. Jeremy, please look closely at this. You can easily verify this by adding a smb_msleep(100) to the top of open_file_ntcreate and run the new samba4 torture test. It does also happen without the msleep, but not as reliably. Thanks, Volker
-rw-r--r--source/smbd/open.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/source/smbd/open.c b/source/smbd/open.c
index 3cd553f55b5..98c2997a97f 100644
--- a/source/smbd/open.c
+++ b/source/smbd/open.c
@@ -1585,6 +1585,15 @@ files_struct *open_file_ntcreate(connection_struct *conn,
fsp_open = open_file(fsp,conn,fname,psbuf,flags|flags2,unx_mode,access_mask);
+ if (!fsp_open && (flags2 & O_EXCL) && (errno == EEXIST)) {
+ /*
+ * Two smbd's tried to open exclusively, but only one of them
+ * succeeded.
+ */
+ file_free(fsp);
+ return NULL;
+ }
+
if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT)) {
if((fsp_open = open_file(fsp,conn,fname,psbuf,
O_RDONLY,unx_mode,access_mask)) == True) {