summaryrefslogtreecommitdiff
path: root/source3/smbd/open.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2005-08-24 13:15:01 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:01:14 -0500
commitfa2ec3651ec88777930e478c888096907006fd8b (patch)
tree5011bf1512812ee43e23dd31d3ba0142847e3000 /source3/smbd/open.c
parente2a5b7da6a10e54a8ab8b41b64544794aaddbeb4 (diff)
downloadsamba-fa2ec3651ec88777930e478c888096907006fd8b.tar.gz
samba-fa2ec3651ec88777930e478c888096907006fd8b.tar.bz2
samba-fa2ec3651ec88777930e478c888096907006fd8b.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 (This used to be commit 58b9e48df03098160f39607d869a3c8e10860ba4)
Diffstat (limited to 'source3/smbd/open.c')
-rw-r--r--source3/smbd/open.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 3cd553f55b..98c2997a97 100644
--- a/source3/smbd/open.c
+++ b/source3/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) {