diff options
author | Volker Lendecke <vlendec@samba.org> | 2005-08-24 13:15:01 +0000 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2005-08-24 13:15:01 +0000 |
commit | fa5776b76d40d2505f5ea30e77bfce192bd53ded (patch) | |
tree | b672733f24261afb7d52c67b11360abc17ef589e | |
parent | 75a969045860609ee51df1134b2ee24dce50c830 (diff) | |
download | samba-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.c | 9 |
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) { |